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 |