1. Git 配置
1.1. git config
git config 语法:git config [–环境参数] key value
有三个环境参数:
- –global 全局配置,写到~/.gitconfig中,即用户路径C:\Users\li.liu下的.gitconfig文件。
- –local 工作目录配置,即所在仓库的配置,写到当前仓库下的.git/config文件中。
- –system 写到$(prefix)/etc/gitconfig文件中,即git安装路径下的etc/gitconfig中。
如:
git config --global user.name leonliu06 // 设置git用户名
git config --global user.email leonliu06@gmail.com //设置git邮箱
git config --global credential.helper store //https方式每次都要输入密码,此命令设置长期存储密码
git config --global push.default simple //推送时,默认到远程跟踪分支
1.2. 查看所有配置
git config --list
1.3. 查看某个环境变量的配置
$ git config user.name
1.4 Git 别名
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.unstage 'reset HEAD --'
$ git config --global alias.last 'log -1 HEAD'
# Git 只是简单地将别名替换为对应的命令。然而,你可能想要执行外部命令,而不是一个 Git 子命令。如果是那样的话,可以在命令前面加入 ! 符号
$ git config --global alias.visual '!gitk'
2. 创建仓库
- 新建本地仓库
git init [project-name]
- 克隆远端仓库
git clone [url]
3. 查看状态与提交
# 查看状态
git status
# 查看没有暂存的变化
git diff
# 查看暂存文件与上一版本区别
git diff --staged
# 添加变化文件到stage,准备提交
git add [file]
# get add的相反操作
git reset [file]
# 提交
git commit -m "[descriptive message]"
4. 分支
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 切换分支
git checkout [branch-name]
4.1. 合并分支
git merge [要合并进来的分支名如b1] 如,git merge b1 表示,将分支b1合并到当前分支。
git merge [branch]
4.2
5. 组、项目、角色
groups,project
groups下面可以创建多个project。组下有成员,组下成员可访问该组下所有project的内容。
角色
角色:
guest, developer, master, owner, 都可以访问,但只有master和owner才可以push。
6. git stash 搁置和恢复未完成的修改
# 临时保存所有本地变化
git stash
# 恢复临时保存的本地变化
git stash pop
# 查看
git stash list
# 丢弃
git stash drop
7. git log 查看提交历史
#
git log
#
git log --follow [file]
#
git diff [first-branch]...[second-branch]
#
git show [commit]
# -p 选项用来显示每次提交的内容差异。
git log -p
# --stat 选项显示每次提交的简略统计信息
git log --stat
8. 同步变化
8.1 git push
git push origin master
只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。当你和其他人在同一时间
克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。你必须先将他们的工作拉取下
来并将其合并进你的工作后才能推送。
$ git push <远程主机名> <本地分支名>:<远程分支名>
git push <远程主机名> <本地分支名>:<远程分支名>
分支推送顺序的写法是<来源地>:<目的地>,
- 所以,git pull是<远程分支>:<本地分支>,
- 而git push是<本地分支>:<远程分支>。
8.2 新建远程分支
如果省略远程分支名,则表示将本地分支推送与之存在“追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
如git push origin master
省略了远程分支,其中“origin” 是远程主机名,master是本地分支,所以,命令表示,将本地的master分支推送到主机的master分支。意思也为:“取出我在本地的master分支,推送到远程仓库的master分支中去”。因此它与运行git push origin master:master
是一样的效果。
git push -u origin newBranch:newBranch // 新建远程分支
8.3 删除分支
- 删除远程分支。
git push
命令如果省略本地分支名,将删除远程分支。如git push origin :remoteb1
将删除远程remoteb1这个分支。
$ git push origin :remote1
# 或者
$ git branch -r -d origin/remote1
- 删除本地分支
git branch -d 本地分支名
9. repo sync
git fetch
更新本地的远程分支。
git rebase
如果远程分支确实有更新,且本地有未提交到服务器的提交,再执行git rebase
, 这样本地的提交就会更新到新的base上,再提交到服务器不会因base不同而报错。
repo sync
实际是执行了两个操作,先git fetch,再基于最新base checkout
出代码,也就更新了本地分支。
10. git fetch 从远程仓库中抓取与摘取
这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成后,你将会拥有那个远程仓库中所有分支的
引用,可以随时合并或查看。如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。所
以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。必须注意 git fetch 命令会将
数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。当准备好时你必须手动将其合并入你的工
作。
如 git fetch origin
表示从origin
主机(即远程仓库)获取所有数据到本地。
如:如果远程有一个分支,名为remoteb1
, 则执行 git fetch origin
后,我们就会得到一个新的远程分支remoteb1
, 执行 git branch -r
就可以看到它。但需注意:fetch操作下载好新的远程分支后,你仍然无法在本地编辑该远程仓库中的分支。即本地不会有一个新的分支(git branch看不到remoteb1,只能看到原来的本地默认分支,如本地master),有的只是一个无法移动的origin/remoteb1指针。
- 可以将远程分支remoteb1合并到本地分支,如在本地master分支下 执行git merge origin/remoteb1,效果是将远程(即origin主机)remoteb1分支合并到了本地master分支上。
也可以在远程分支remoteb1基础上分化出一个新的本地分支出来,如以下命令 git checkout -b localb1 origin/remoteb1。
git fetch + git merge = git pull
git fetch [origin] 将远程文件下载到本地
git merge origin/master 将远程master下载的文件合并到本地当前分支
11. git checkout -b [要新建的本地分支名] [远程主机名如origin]/[远程分支名如remoteb]
git checkout -b [要新建的本地分支名] [远程主机名如origin]/[远程分支名如remoteb]这个命令是新建一个本地分支,并切换过去。这个分支同远程分支remoteb一样。是origin/remoteb的一个跟踪分支。
12 跟踪远程分支
从远程分支checkout出来的本地分支,称为跟踪分支(tracking branch)。
跟踪分支是一种和远程分支有直接联系的本地分支。在跟踪分支里输入git push
, Git会自行推断应该向哪个服务器的哪个分支推送数据。
反过来,在这些分支里运行git pull
会获取所有远程索引,并把他们的数据都合并到本地分支中来。
在克隆仓库时,Git通常会自动创建一个名为master
的分支来跟踪origin/master
。这正是 git push
和 git pull
一开始就能正常工作的原因。
13 git reset
一个引用文件 .git/refs/heads/master 记录了分支中最新的一次提交的ID:
cat .git/refs/heads/master 文件内容。例如显示 22f8aae534916e1174711f138573acfbb47e489c
git cat-file -t 22f8aae 的前几个字符 显示commit
git log --oneline 显示commit ID 列表
22f8aae git ignore file added.
4e79a0b Rename third to third.txt
46ae7e3 remove branch_first.txt file from master branch
55d1e70 branch first file
545a382 Merge commit '35bbd32'
$ git reset --hard HEAD^ //reset 到上一次提交
HEAD is now at 4e79a0b Rename third to third.txt
$ git log --oneline
4e79a0b Rename third to third.txt
46ae7e3 remove branch_first.txt file from master branch
55d1e70 branch first file
545a382 Merge commit '35bbd32'
HEAR^的意思是最新一次提交的父提交。reset后,提交日志里没了最新一次提交,
$ cat .git/refs/heads/master
4e79a0ba92f1ae63dc661e29343fa0c369ca480d
引用文件也记录了reset后的最后一次提交。reset后,git没有删除最新提交的相关信息,包括目录树,因此只要我们记住提交ID,便可以重新reset回来:
$ git reset --hard 22f8aae
HEAH is now at 22f8aae git ignore file added.
$ git log --oneline
22f8aae git ignore file added.
e79a0b Rename third to third.txt
46ae7e3 remove branch_first.txt file from master branch
55d1e70 branch first file
545a382 Merge commit '35bbd32'
这样查看log,发现最新提交又回来了。但是如果我们忘了最新提交ID,可以用git reflog命令,它可以查看最总引用变更的记录:
$ git reflog
22f8aae HEAD@{0}: reset: moving to 22f8aae
4e79a0b HEAD@{1}: reset: moving to HEAD^
22f8aae HEAD@{2}: reset: moving to 22f8aae
4e79a0b HEAD@{3}: reset: moving to HEAD^
git reflog可以找到前面任意操作的记录,并且可以reset到任意提交。
$ git reset --hard origin/master 将本地的状态回退到和远程的一样。
$ git revert HEAD 回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit
git reset: This will ‘unstage’ all the files you’ve added after your last commit;
14. 远程仓库版本回退
git reset --hard HEAD
只是在本地仓库中回退版本,而远程仓库的版本不会变化,这样,即使本地reset了,但如果再git pull,那么远程仓库的内容又会和本地之前版本的内容进行merge。这进可以有2种办法来解决:
- 直接在远程server的仓库目录下,执行git reset -soft commitID 来回退。注意,在远程不能使用mixed或hard参数
- 在本地直接把远程的master分支给删除,然后再把reset后的分支内容给push上去,如下:
$ git branch old_master //新建old_master分支做备份
$ git push origin old_master:old_master //push到远程
$ git reset --hard 某次提交ID //本地仓库回退到某个版本
$ git push origin :master //删除远程分支
$ git push origin master:master //重新创建远程分支
在删除远程master分支时,可能会有问题,见下:
$ git push origin :master
error: By default, deleting the current branch is denied, because the next
error: 'git clone' won't result in any file checked out, causing confusion.
error:
error: You can set 'receive.denyDeleteCurrent' configuration variable to
error: 'warn' or 'ignore' in the remote repository to allow deleting the
error: current branch, with or without a warning message.
error:
error: To squelch this message, you can set it to 'refuse'.
error: refusing to delete the current branch: refs/heads/master
To [email protected]:gitosis_test
! [remote rejected] master (deletion of the current branch prohibited)
error: failed to push some refs to '[email protected]:gitosis_test'
这时需要在远程仓库目录下,设置git的receive.denyDeleteCurrent
参数
$ git receive.denyDeleteCurrent warn
然后,就可以删除远程的master分支了
虽然说有以上2种方法可以回退远程分支的版本,但这2种方式,都挺危险的,需要谨慎操作……
15. git rebase
很好的一种避免合并(git merge)代码时出现冲突的方法,即合并(git merge)之前,执行git rebase
命令。
如:要把b1 合并到b2上:
首先切换到b1,执行 git rebase b2 //把b1发生过的commit衍合过来,
然后切换到b2,执行 git merge b1 //把b1合并到b2。
当本地分支b1中的一些commit 和 远程分支b2一些commit不在同一时间轴上,即b1的有些commit要插入到b2的某些commit之间,
这样就会造成代码冲突。所以这个时候就要使用git rebase.
1> 新建一个与b2跟踪的本地分支temp,
git checkout origin/b2 -b temp
为保证最新,可以执行一下git pull
2> 切换到b1,
git checkout b1
3> 合并代码,并整理
git rebase temp //会将temp分支的代码合并过来,并按照提交的顺序排序
4> 因为顺序是重新整理的,所以肯定会出现冲突
5> 解决冲突(编辑冲突文件),最后 git add * , 但不需要git commit
6> 解决后,执行 git rebase --continue
7> 重新提交代码: git push
16. Tag
16.1 列出标签
$ git tag
16.2 打标签
git标签分为两种类型:轻量标签和附注标签。轻量标签是指向提交对象的引用,附注标签则是仓库中的一个独立对象。建议使用附注标签。
# 创建轻量标签
$ git tag v0.1.2-light
# 创建附注标签
$ git tag -a v0.1.2 -m “0.1.2版本”
创建轻量标签不需要传递参数,直接指定标签名称即可。
创建附注标签时,参数a即annotated的缩写,指定标签类型,后附标签名。参数m指定标签说明,说明信息会保存在标签对象中。
16.3 切换到标签
与切换分支命令相同,用git checkout [tagname]
查看标签信息
用git show命令可以查看标签的版本信息:
$ git show v0.1.2
17. git cherry-pick
git cherry-pick
用于把另一个本地分支的commit修改应用到当前分支。
如 git cherry-pick commit-ID1 commit-ID2 commit-ID3
11.1 命令读的是本地commit。
11.2 pick过来后,生成新的commit-ID
11.3 如果拿过来的commit本身是一个merge commit,则可能会用到-m参数,参数值为数字1或2,如
git cherry-pick commit-ID -m 2
参数的意义参考 https://segmentfault.com/q/1010000010185984
18. 添加远程仓库
- 先在github.com上新建一个仓库superalloy(远程库)。
- 将本地仓库与远程库关联:
$ git remote add origin git@github.com:leonliu06/superalloy.git (SSH)
# or
$ git remote add origin https://github.com/leonliu06/MyServlet.git (HTTP)
- 关联后,使用命令:
git push -u origin master
第一次推送master分支的所有内容。
19. 修改最后一次commit的注释
git commit --amend
http://blog.csdn.net/lxf0613050210/article/details/52525083
一:最新的一次提交
当你不小心,写错了提交的注视/信息,该如何处理呢。理论上,SCM是不应该修改历史的信息的,提交的注释也是。
不过在Git中,其commit提供了一个–amend参数,可以修改最后一次提交的信息.但是如果你已经push过了,那么其历史最后一次,永远也不能修改了。
我使用git commit –amend已经push过的
$ git commit --amend
然后在出来的编辑界面,直接编辑注释的信息,保存退出
二:历史提交
git使用amend选项提供了最后一次commit的反悔。但是对于历史提交呢,就必须使用rebase了。
git rebase -i HEAD~3
表示要修改当前版本的倒数第三次状态。
这个命令出来之后,会出来三行东东:
pick:*******
pick:*******
pick:*******
如果你要修改哪个,就把那行的pick改成edit,然后保存退出。
这时通过git log你可以发现,git的最后一次提交已经变成你选的那个了,这时再使用:
git commit --amend
来对commit进行修改。
修改完了之后,要回来对不对?
使用git rebase –continue
OK,一切都搞定了。
20. 检查(访问)某个commit
20.1
1 checkout 一个分支test。
2 git reset --hard commitID。
3 查看文件。
4 checkout 回去。
5 删除test分支。
20.2
git checkout [commitID]
21. Ubuntu下使git仓库下的文件显示状态图标
sudo apt-get install rabbitvcs-nautilus
然后重启。
22. core.autocrlf
Windows系统使用回车(CR)和换行(LF)来作为行尾结束符,
而Linux系统使用LF来作为行尾结束符。
git config –global core.autocrlf true #表示提交时CRLF –> LF,而签出时LF –> CRLFgit config –global core.autocrlf true #表示提交时CRLF –> LF,而签出时LF –> CRLFgit config –global core.autocrlf input #表示提交时CRLF –> LF,而签出时不转换
23. 获得两个版本间所有变更的文件列表
git diff –name-status –author=li.liu –since=21days 6b45132e11fc0db8101b9a2726fd155ea9354829 HEAD
24. 设置远程跟踪分支
本地当前分支dev_20170907下:
git branch –set-upstream-to=origin/dev_20170907
25. 执行git push 出现 fatal: The upstream branch of your current branch does not match the name of your current branch.
说明本地分支与远程跟踪分支名称不一样,默认git push时,git不知道你是要新建一个与本地同名的远程分支还是直接推送到远程跟踪分支。
解决:
- 不使用默认git push命令,使用全命令:git push origin HEAD:远程分支名
或 git push origin 本地分支名:远程分支名 - 更改本地分支名与远程分支名一样,这样就可使用默认命令git push.
git branch -m 更改后的新名称
26. 打开git帮助文档
- git help git 会打开 file:///C:/Program%20Files/Git/mingw64/share/doc/git-doc/git.html 文档
- git help checkout 会打开 file:///C:/Program%20Files/Git/mingw64/share/doc/git-doc/git-checkout.html 文档
27. git checkout “某一个提交ID”
将HEAD指针指向这个提交ID,代码回到该提交的状态。
回到HEAD:用 git branch 列出本地所有分支,然后 git checkout 分支名,回到该分支的HEAD处。
28 .gitignore
在项目根目录下新建此文件,文件中写入不想跟踪的文件路径 或 文件名,实现对这些文件的过滤,不作为版本管理。
29. 查看Git的各命令的用法
git help 或者 man git
查看某条命令怎么用,如config:
git help config
30. git diff
在本书中,我们使用 git diff 来分析文件差异。但是,如果你喜欢通过图形化的方式或其
它格式输出方式的话,可以使用 git difftool 命令来用 Araxis ,emerge 或 vimdiff 等软
件输出 diff 分析结果。使用 git difftool –tool-help 命令来看你的系统支持哪些 Git
Diff 插件。