孤舟蓑笠翁,独钓寒江雪

Git 常用命令

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 将 每个提交 放在一行显示,这在提交数很大时非常有用。另外还有 shortfullfuller 可以用。 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" 为当前的入栈使用指定的说明Test
  • git 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三个参数的区别:

  1. --local的作用域最小,仅对当前的git项目的配置
  2. --global的作用域是针对当前用户
  3. --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 进入编辑模式,可以执行editsquash等操作。

  • pickgit会应用这个补丁,以同样的提交信息(commit message)保存提交。
  • squashgit会把这个提交和前一个提交合并成为一个新的提交。
  • editgit会完成同样的工作,但是在对edit的提交进行操作之前,它会返回到命令行让你对提交进行修正,或者对提交内容进行修改。可以在这个提交进行amend,分割提交等等修改操作。
  • 丢弃:rebase的最后一个作用是丢弃提交。如果把一行删除而不是指定picksquashedit中的任何一个,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
2
git pull aosp android11-release
git checkout -b android11-release remotes/aosp/android11-release

把代码push到远程分支。

1
git push -f origin HEAD:android11

git merge

1
2
git checkout master
git merge --no-ff dev // merge dev 分支到 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
2
3
4
5
6
7
8
9
git fetch origin
git rebase origin/develop
//修改冲突文件
...
git add .
git rebase --continue
git push origin HEAD:refs/changes/<changeID>
//不会产生新的changes记录,将原changes记录重新review提交即可
git pull

解决本地没有提交记录的远程冲突

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 下面的 url 指的是 pull request 对应的地址,比如: ssh://name@test.com:29418/app/ProjectName refs/changes/40/1000/3
git fetch <url> && git checkout FETCH_HEAD
git checkout -b new_branch_name // 新建一个本地分支用来解冲突
git fetch origin //远程仓库的名称可以用 git remote -v 来查看
git rebase origin/develop //rebase 你冲突的代码分支,develop为当前提交代码所在的分支
修改冲突文件
git rebase --continue
git push origin new_branch_name:refs/for/develop
git checkout develop
git branch -D new_branch_name
//不会产生新的 changes 记录,将原 changes 记录重新 review 提交即可,这时在原冲突机器上直接pull会本地冲突,需要
git reset --hard HEAD^
//否则会出现cannot do a partial commit during a merge.最后更新下代码
git pull