git log
git log -p
:显示每一次的提交的差异。git log -p -n
(n为次数,整数):指定了显示差异的次数,用 -2 则仅显示最近的两次更新.git log --stat
:显示简要的增改行数统计,后面跟次数比如 -2 则仅显示最近的两次更新。git log --author=寒江蓑笠
:显示某个作者的提交记录。选择多个作者可以使用git log --author="AA\|BB"
git log --committer=寒江蓑笠
:显示某个提交者的提交记录。git log --since, --after
:仅显示指定时间之后的提交。git log --until, --before
:仅显示指定时间之前的提交。git log --pretty=oneline
:--pretty
选项可以指定使用完全不同于默认格式的方式展示提交历史。比如用oneline
将 每个提交 放在一行显示,这在提交数很大时非常有用。另外还有short
,full
和fuller
可以用。format
可以定制要显示的记录格式,这样的输出便于后期编程提取分析。git log --shortstat
:只显示 –stat 中最后的行数修改添加移除统计。git log --name-only
:仅在提交信息后显示已修改的文件清单。git log --name-status
:显示新增、修改、删除的文件清单。git log --abbrev-commit
:仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。git log --relative-date
:使用较短的相对时间显示(比如,”2 weeks ago”)。git log --graph
:显示 ASCII 图形表示的分支合并历史。git log --oneline
:只显示一行的提交信息
git checkout
git checkout -- **(file)
:还原对file的修改git checkout -b master remotes/master
:在本地建立一个与服务器对应的分支并切换过去
git branch
git branch test
:创建一个test的本地分支git branch -d
:删除本地分支git branch -D
:强行删除本地分支git branch --set-upstream-to=origin/V3.3 V3.3
:将本地分支和远程分支关联
git stash
git stash
:把当前修改保存到暂存区git stash pop
:把暂存区的内容恢复到本地git stash list
:显示stash 列表git stash apply stash@{1}
:取出指定版本号栈中的内容,栈里面的记录仍然保存git stash clear
:清楚stash列表git stash save "Test"
为当前的入栈使用指定的说明Testgit stash show
查看最近的缓存的文件列表git stash show stash@{0}
查看名为stash{0}缓存的文件列表git stash show -p stash@{0}
查看名为stash{0}缓存的文件差异git stash drop stash@{0}
丢弃名为stash{0}缓存
git config
先说一下--local
、--global
和--system
三个参数的区别:
--local
的作用域最小,仅对当前的git项目的配置--global
的作用域是针对当前用户--system
的作用域最大,是针对整个计算机系统
再来说一下他们的优先级,如果在三个级别都有配置,那么优先级为:--local
> --global
> --system
- 查看配置:
git config --local -l
- 配置用户名和邮箱:
git config --local user.name "xx"
git config --global user.email "xx"
git reset
git reset --mixed
:此为默认方式,不带任何参数的git reset
,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息git reset --soft
:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可git reset --hard
:彻底回退到某个版本,本地的源码也会变为上一个版本的内容git reset HEAD^
:默认的reset
方式,指向HEAD之前最近的一次commit,git reset --hard <commit>
:自从以来在working directory中的任何改变都被丢弃,并把HEAD指向 git reset --hard HEAD~2
:丢弃最近两次的提交
删除远程仓库上最近的提交:
先git reset --hard HEAD~2
,然后git push -f
git rm
git rm test
:删除test文件的跟踪,并且删除本地文件git rm --cached test
:删除test文件的跟踪,但是保留在本地
git commit
git commit --amend
:对最后一次的 commit进行修改git commit --amend -m "Test"
对最后一次的 commit进行修改,并修改提交信息git commit -s
:添加 Signed-off-by: 信息
git rebase
假设mywork
是以远程分支origin
创建的本地分支。rebase
个人理解就是重新在base分支提交的意思。git rebase
用于把一个分支的修改合并到当前分支。1
2$ git checkout mywork
$ git rebase origin
这些命令会把你的”mywork”分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到.git/rebase
目录中),然后把mywork
分支更新 为最新的origin
分支,最后把保存的这些补丁应用到mywork
分支上。相当于在mywork
上更新了它的 “base” origin
分支。
这个要注意和git merge
的区别。
基本操作
git rebase -i
进入编辑模式,可以执行edit
,squash
等操作。
pick
:git
会应用这个补丁,以同样的提交信息(commit message)保存提交。squash
:git
会把这个提交和前一个提交合并成为一个新的提交。edit
:git
会完成同样的工作,但是在对edit
的提交进行操作之前,它会返回到命令行让你对提交进行修正,或者对提交内容进行修改。可以在这个提交进行amend
,分割提交等等修改操作。- 丢弃:
rebase
的最后一个作用是丢弃提交。如果把一行删除而不是指定pick
、squash
和edit
中的任何一个,git会从历史中移除该提交。
合并提交
git rebase -i HEAD~10
:将前10个提交合并为一个。
执行以后进入编辑模式,按提示操作,将第二个及以后的pick
修改为squash
或者s
,然后再按提示操作保存退出。
git rebase -i a5ff73
: 编辑 a5ff73 前面的所有提交。
git pull
git pull --rebase
:表示把你的本地当前分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到.git/rebase
目录中),然后把本地当前分支更新 为最新的origin
分支,最后把保存的这些补丁应用到本地当前分支上。git pull origin branchA
:只更新branchA分支
git push
git push origin --delete <branch_name>
:删除远程分支git push origin <branch_name>
:将本地分支推到远程,然后再调用git branch --set-upstream-to=origin/V3.3 V3.3
将本地分支和远程分支关联
patch
git format-patch -n
:为前面的n次提交生成一个patch
应用patch:
先检查patch文件:# git apply --stat newpatch.patch
检查能否应用成功:# git apply --check newpatch.patch
打补丁:# git am --signoff < newpatch.patch
如果有冲突将会合并不成功
可以下面方法:
http://blog.chinaunix.net/uid-27714502-id-3479018.html
先手工 apply patch
中没有冲突的部分:git apply --reject 0001-test.patch
这样,就把没有冲突的文件先合并了,剩下有冲突的作了标记。
可以看输出,同时,还会产生一个*.rej
文件,里面也是上面这段因为冲突无法合并的代码片断。
根据apply的输出提示以及mm/sparse.c.rej
文件中的描述,手动修正代码。
改好之后,用 git add
把文件添加到缓冲区,同时也要把其他没有冲突合并成功了的文件也加进来,因为在作 apply
操作的时候他们也发生了变化。git am --resolved
然后合并提交即可。
git remote
- git remote: 不带参数,列出已经存在的远程分支
- git remote -v | –verbose: 列出详细信息,在每一个名字后面列出其远程url
- git remote add
: 添加远程仓库 - git remote show
:查看本地和远程分支的状态,origin为远程分支的名称 - git remote rename <原名字> <新名字>:重命名远程库
- git remote remove
:删除添加的远程库
push 一个仓库的代码到另外一个仓库,带提交记录
比如,把Android aosp的Launcher3的android11-release分支连提交记录push到我自己的仓库android11分支。
首先为本地仓库添加一个远程仓库:
1 | git remote add aosp https://android.googlesource.com/platform/packages/apps/Launcher3 |
然后为远程仓库添加一个本地分支:
1 | git pull aosp android11-release |
把代码push到远程分支。
1 | git push -f origin HEAD:android11 |
git merge
1 | git checkout master |
git merge -s ours
cherry pick 与 git merge
git cherry-pick
git cherry-pick <commitID>
将commitID对应的本地变更pick到当前分支。
cherry-pick 后可以加多个commitID用于批量提交,或者添加一个commitID列表:
git cherry-pick 1234 2345 4567
有冲突的话解决冲突,然后 git add <冲突文件>,然后 git cherry-pick –continue,最后 push 到分支再合入就行了。
如果时连续的提交,可以写上首尾提交,然后中间加..,这样就可以把 1234直到4567前面的提交都pick过来。
git cherry-pick 1234..4567
git fetch
解 gerrit 冲突
解决本地有提交记录的远程冲突
1 | git fetch origin |
解决本地没有提交记录的远程冲突
1 | // 下面的 url 指的是 pull request 对应的地址,比如: ssh://name@test.com:29418/app/ProjectName refs/changes/40/1000/3 |