Git简明教程-从不会到能用?还是只是连接远称仓库?(笑)

Posted by Steve on July 8, 2018

本教程针对Git的初学者

今天介绍一下之前刚刚学的版本控制利器——Git。其实说实在的版本控制,我真正算是会用也就是今年。之前以前用Github啥的客户端直接就图形化操作,然后自己搞也不会出现冲突啥的。所以也就只知道皮毛而已。

Git的背景在这里就不过多的交代了。Git可以说是当今使用范围最广的版本控制工具。由于“分支”概念的存在,所以特别是和多人合作,并行开发。好像之前大家用集中式版本管理工具SVN,我没用过所以不敢乱说。但是某东已经从SVN切换成了Git,想必Git必有过人之处吧。

个人学习使用Git的话,还是要有个可以操练的东西才行,可以选择GithubVisual Studio Team Services。Github是赫赫有名的开源项目托管的网站,缺点是免费用户的代码是开源的。VSTS的话,是微软的代码托管服务,如果是个人小团队(5人以下?)则可以免费使用。优点是代码闭源。

今天以VSTS为例,和我一起走一波连接Git的远程仓库,毕竟连上了远称仓库之后,想怎么玩就怎么玩了,Git光看效果不大,还是要操练起来才行。

01.下载安装Git,并在VSTS上新建一个项目

去官网下载Git,然后一路下一步安装。(额,默认以windows为准了哈) 下载Git

安装好Git之后,打开Git Bash,首先利用ssh-keygen命令来创建公钥,直接用默认路径就好,密码也可以留空,所以只需要敲击三次回车即可。随后用cat ~/.ssh/id_rsa.pub命令来查看生成的密钥。密钥稍后用。 ssh

注册了微软账号之后,登陆应该要先建一个Team,因为我很久之前就建好了,这里就不演示了。然后在点击New Project新建

填写Project nameVersion control选择Git。工作流目前先默认就行,想要了解更多就去外链上看下吧。 填写信息

创建成功了,选择SSH。后面的就是远程仓库地址。下不要关闭页面。 仓库地址

点击Manage SSH Keys后,在弹出的页面上点击Add。将刚刚生成的密钥填写进去并Save 添加ssh公钥 添加ssh公钥

回到刚才说不要关闭页面的页面,对项目进行初始化,展开下面的选项,并点击Initialize初始化项目

至此,项目就创建成功了。授权也弄好了。

02.Clone项目

Git Bash页面,然后进入到我们想要下载代码的文件夹中。输入git clone 远称仓库地址。因为Git Bash中的命令和linux中的一样,这里就不赘述了。 git_clone

Git的官方介绍已经很详细了,现在已经有了环境,就可以边看官方教程边学习了。除了官方的文档以外,廖雪峰老师的教程以及[菜鸟教程](https://www.runoob.com/git/git-tutorial.html也很不错。

xx.附录-常用Git命令

git 的使用

命令 简介 备注
git –version 查看git版本  
git clone xxx 克隆仓库
git add ./xixi/heihei.txt 将文件heihei.txt添加至staging area  
git add . 将当前目录下的所有文件加入到staging area  
git commit -m ‘添加一个heihei.txt文件’ 将staging area中的文件提交到仓库  
git reset ./xixi/heihei.txt 撤销添加到staging area中的指定文件  
git status 查看当前仓库的状况  
git fetch 从远程仓库获取最新的信息  
git pull 获取远程仓库的最新版本并合并到本地  
git push 将本地修改推到远程仓库  
git branch dev-xixi 以当前分支创建一个dev-xixi的分支 也可以用git checkout -b dev-xixi
git branch -al 查看本地及远程的所有分支  
git remote -v 查看git的服务器地址 使用q来退出
git remote show origin 提供有关远程的一些信息 也可以看到远程地址
git help remote 查看remote的详细说明  
git blame -L 123,125 ./xixi/heihei.txt 查看heihei.txt文件第123-125行最新的修改人及时间 去掉 -L也可以,就是查全文,按q来退出
git restore ./ 还原改动的文件  
git clean 清除未track的文件或文件夹,不能直接使用,一定要跟参数 -n 显示要删除哪些文件
-f 删除文件
-df 删除文件及文件夹
git log 查看历史提交(复杂模式) git log –oneline

git checkout的使用

命令 简介 备注
git checkout dev 切换至dev分支  
git checkout –– templates/index.html 放弃本地尚未commit的修改 谨慎使用,除非使用了git stash,不然只能去local history里面找之前的代码了
git checkout . 放弃本地尚未commit的所有修改 同上

git config的使用

命令 简介 备注
git config ––global user.name “liutianyu” 设置全局的用户名  
git config ––global ––list 列出所有全局的配置项  
git config ––local ––list 在一个git repository下面使用,查看当前的配置  
git config ––local user.name “liutianyu” 设置局部用户名
git config ––local user.email “liutianyu@x.com” 设置局部邮箱
git config ––system ––unset credential.helper 清除登录信息

git stash的使用

命令 简介 备注
git stash save “xixi” 创建名为“xixi”的stash,并将当前的工作区回归为初始状态。
git stash list 列出当前所有的stash
git stash appley 0 将序列号为0的stash中的内容恢复到当前的工作区,并且不删除
git reset ––hard HEAD 强制将当前的改动删掉,回归到初始状态。
git stash pop 0 将序列号为0的stash中的内容恢复到当前的工作区,并且删除
git stash drop 0 删除序列号为0的stash
git stash clear 清空stash中的所有内容

commit后回滚

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
gitpod /workspace/furybrand.github.io $ git push
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 16 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 418 bytes | 418.00 KiB/s, done.
Total 5 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/FuryBrand/furybrand.github.io.git
 ! [remote rejected] master -> master (refusing to allow an OAuth App to create or update workflow `.github/workflows/jekyll.yml` without `workflow` scope)
error: failed to push some refs to 'https://github.com/FuryBrand/furybrand.github.io.git'
gitpod /workspace/furybrand.github.io $ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
gitpod /workspace/furybrand.github.io $ git reset --soft HEAD^
gitpod /workspace/furybrand.github.io $ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    .travis.yml -> ..travis.yml
        modified:   .github/workflows/jekyll.yml

gitpod /workspace/furybrand.github.io $ git restore .github/workflows/jekyll.yml
gitpod /workspace/furybrand.github.io $ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    .travis.yml -> ..travis.yml
        modified:   .github/workflows/jekyll.yml

gitpod /workspace/furybrand.github.io $ git restore .github/workflows/jekyll.yml --staged
gitpod /workspace/furybrand.github.io $ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    .travis.yml -> ..travis.yml

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .github/workflows/jekyll.yml

gitpod /workspace/furybrand.github.io $ git restore .github/workflows/jekyll.yml
gitpod /workspace/furybrand.github.io $ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    .travis.yml -> ..travis.yml

git初始化仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Command line instructions
You can also upload existing files from your computer using the instructions below.

Git global setup
git config --global user.name "liutianyu"
git config --global user.email "liutianyu@x.com"

Create a new repository
git clone git@git.jd.com:class6/itat-auto-test.git
cd itat-auto-test
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
 
Push an existing folder
cd existing_folder
git init
git remote add origin git@git.jd.com:class6/itat-auto-test.git
git add .
git commit -m "Initial commit"
git push -u origin master

Push an existing Git repository
cd existing_repo
git remote rename origin old-origin
git remote add origin git@git.jd.com:class6/itat-auto-test.git
git push -u origin --all
git push -u origin --tags

删除所有提交记录

因为拿git当作笔记软件,时间久了提交记录越来越多会导致.git文件夹非常臃肿(主要是存了一些二进制文件,我承认我的路子有点野,但是在内网同步盘不可用的情况下,git貌似是唯一的好用的云笔记选择了) 下面的步骤是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
liutianyu@LX-WXZB MINGW64 /d/myWorkspace
$ mv furybrand/ furybrand1
liutianyu@LX-WXZB MINGW64 /d/myWorkspace
$ mkdir furybrand
liutianyu@LX-WXZB MINGW64 /d/myWorkspace
$ cd furybrand
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand
$ git init
Initialized empty Git repository in D:/myWorkspace/furybrand/.git/
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ vi README.md
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ cp ../furybrand1/.git
./          ../         .git/       .gitignore  .vscode/
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ cp ../furybrand1/.git/co
COMMIT_EDITMSG  config
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ cp ../furybrand1/.git/co
COMMIT_EDITMSG  config
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ cp ../furybrand1/.git/config ./.git/
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ git add .
warning: LF will be replaced by CRLF in README.md.
The file will have its original line endings in your working directory
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ git commit -m "Initial commit"
[master (root-commit) 54d05a4] Initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ git push -f --set-upstream origin master
info: detecting host provider for ''...
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 210 bytes | 210.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Coding: Checking the pushed content...
remote: Updating references: 100% (1/1)
Branch 'master' set up to track remote branch 'master' from 'origin'.
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ cp ../furybrand1/* ./ -r
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ git add .
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ git commit -m "go"
[master 3e207dc] go
 142 files changed, 428831 insertions(+), 1 deletion(-)
 create mode 100644 PRODUCT/README.md
 create mode 100644 temp.md
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ git push
info: detecting host provider for ''...
Enumerating objects: 164, done.
Counting objects: 100% (164/164), done.
Delta compression using up to 8 threads
Compressing objects: 100% (161/161), done.
Writing objects: 100% (163/163), 89.59 MiB | 1.59 MiB/s, done.
Total 163 (delta 10), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (10/10)
remote: Coding: Checking the pushed content...
remote: Updating references: 100% (1/1)
   54d05a4..3e207dc  master -> master

更新日志

  • 2020年9月23日:追加回滚操作
  • 2021年12月1日:追加“删除所有提交记录”