Git命令篇

虽然公司里面用SVN,但是为了探索更好的团队协作方式,我觉得有必要再把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
#查看git版本
git version

#创建
git init

#配置email
git config --global user.email "you@example.com"

#配置用户名
git config --global user.name "Name"

#取消某一配置项
git config --unset user.name

#查看配置列表
git config --list

#查看配置
cat ~/.gitconfig

#配置github密钥,生成id_rsa和id_rsa.pub
ssh-keygen -t rsa -b 4096 -C "ynkonghao@gmail.com"

#测试ssh通道
ssh -T git@github.com

#全局设置git大小写敏感
git config --global core.ignorecase false

克隆:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#克隆本地仓库
git clone /path/to/repository

#克隆远端仓库
git clone username@host:/path/to/repository

#克隆远程某个分支
git clone -b 远程分支 git地址

或者

git clone .git地址

git branch -a 先查看当前远端分支情况

git checkout origin/xxx 选择远端xxx分支

git branch xxx 创建本地xxx分支

git checkout xxx 选择新创建的分支就可以了。

添加:

1
2
3
4
5
6
7
8
9
#添加指定文件到暂存区
git add <filename>

#添加所有文件到暂存区
git add *
git add .

#显示有变更的文件
git status

提交:

1
2
3
4
5
#提交文件到本地仓库
git commit -m "代码提交信息"

#提交文件到本地仓库,只处理跟踪过的文件,未跟踪过的文件不会提交
git commit -a -m "代码提交信息"

删除:

1
2
3
4
5
6
7
8
#直接删除已commit的文件
git rm [file]

#保留文件,但是删除跟踪
git rm --cached [file]

#强制把已add但是还未commit的删除
gir rm -f [file]

远程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#将你的仓库连接到某个远程服务器
git remote add origin [server]

#显示所有远程仓库
git remote -v

#显示某个远程仓库的信息
git remote show [remote]

#增加一个新的远程仓库,并命名
git remote add origin git地址

#删除远程仓库
git remote remove origin

更新&推送:

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
#更新远程仓库的所有变动
git fetch [remote]

#取回远程仓库的变化,并与当前分支合并
git pull [remote] [branch] = git fetch origin + git merge origin/branch
#抓取最新版本到本地仓库+把工作区更新合并

#取回origin主机的next分支,与本地的master分支合并
git pull origin next:master

#从远程拉取分支到本地
git pull origin iot:iot

#假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它
git fetch origin + git reset --hard origin/master

#将该分支推送到远端仓库,如origin
git push <远程主机名> <本地分支名>:<远程分支名>
git push origin <本地远程名一样>

#强行推送当前分支到远程仓库,即使有冲突
git push [remote] --force

#强制推送本地master到远程master
git push -f master master

#推送所有分支到远程仓库
git push [remote] --all

#当前分支与远程分支之间建立追踪关系,以后直接git push
git push --set-upstream branch origin/branch
git branch --set-upstream-to=origin/remote_branch your_branch

#推送本地分支到远程的remote_branch分支并建立关联
git push --set-upstream origin remote_branch

#设置为默认远程,以后直接git push
git push -u origin master

分支:

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
#列出所有本地分支
$ git branch

#列出所有远程分支
$ git branch -r

#列出所有本地分支和远程分支
$ git branch -a

#新建一个分支,但依然停留在当前分支
$ git branch [branch-name]

#删除分支
git branch -d [branch-name]

#指定master分支追踪origin/next分支
git branch --set-upstream master origin/next

#把本地分支与远程分支关联
git branch --set-upstream-to origin/next

#切换到远程的某一分支
git checkout -b dev origin/dev

#查看本地远程分支对应情况
git branch -vv

#重命名远程分支对应的本地分支
git branch -m oldName newName

#删除远程分支
git push --delete origin oldName

#上传新命名的本地分支
git push origin newName

切换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#新建一个分支,并切换到该分支
git checkout -b [branch]

#如预发布分支是从Develop分支上面分出来的,并切换到该分支
git checkout -b release-1.2 develop

#切换分支,并更新工作区
git checkout [branch-name]

#切换到上一个分支
git checkout -

#恢复暂存区的所有文件到工作区
git checkout .

#恢复暂存区的指定文件到工作区,即丢弃工作区修改
git checkout -- [file]

#文件从本地仓库复制到工作区
git checkout HEAD -- [file]

#恢复某个commit的指定文件到暂存区和工作区
git checkout [commit] [file]

标签:

1
2
3
4
5
6
7
8
#列出所有tag
git tag

#新建一个tag在当前commit
git tag [tag]

# 推送tag到远端
git push origin --tags

合并:

1
2
3
4
5
6
7
8
#合并其他分支到你的当前分支
git merge [branch]

#取消快进式合并-fast-farward merge
git merge --no-ff [branch]

#所有的合并都有可能会有冲突,冲突手动解决之后,需要add以标记合并成功
git add <filename>

日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#查看本地仓库提交日志
git log

#查看的同时显示每次提交内容的差异
git log -p

#只看frank作者的提交日志
git log --author=frank

#一个压缩后的每一条提交记录只占一行的输出
git log --pretty=oneline

#通过 ASCII 艺术的树形结构来展示所有的分支
git log --graph --oneline --decorate --all

区别:

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
#显示暂存区和工作区的差异
git diff [filepath..]

#显示工作区与当前分支最新commit之间的差异
git diff HEAD [filepath..]

#在合并改动之前可以预览分支间的差异
git diff <source_branch> <target_branch> [filepath..]
git diff master origin/master [filepath..]

#比较本地工作区与运程版本库
git diff origin/master [filepath..]

#比较暂存区和版本库的差异
git diff --cached [filepath..]

#比较暂存区与运程版本库
git diff --cached origin/master [filepath..]

#比较工作区与指定commit-id的差异
git diff commit-id [filepath..]

#比较两个commit-id之间的差异
git diff commit-id commit-id

#比较暂存区与指定commit-id的差异
git diff --cached commit-id [filepath..]

#查看某次提交内容
git show commit-id

撤销:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#重置暂存区,与上一次commit保持一致
git reset

#重置暂存区,但工作区不变
#(HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本写成HEAD~100)
git reset HEAD [file]

#重置暂存区与工作区,与上一次commit保持一致
git reset --hard

#重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git reset [commit]

#重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --hard [commit]

#重置当前HEAD为指定commit,但保持暂存区和工作区不变
git reset --keep [commit]

#仅仅只是撤销已提交的版本库,不会修改暂存区和工作区
git reset --soft [commit]

#仅仅只是撤销已提交的版本库和暂存区,不会修改工作区
git reset --mixed [commit]

备忘
这是让master分支上的改动merge到zhangli分支

参考资料

常用 Git 命令清单

廖雪峰的Git教程