0%

Git进阶用法

Git重要概念:

对于任何一个文件,在 Git 内都只有三种状态:已修改(modified)、已暂存(staged)、已提交(committed):

  • 已修改表示修改了某个文件,但还没有提交保存.
  • 已暂存表示把已修改的文件放在下次提交时要保存的清单中.
  • 已提交表示该文件已经被安全地保存在本地数据库中了.

两种分支合并的方法,rebase 与 merge:

Rebase的原理:

  • 先把本地的未push的提交生成一个个patch
  • 然后移除本地未上传的提交
  • 把服务器最新的提交全拉下来
  • 按修改顺序,重新应用本地的提交生成的patch

由此可见,rebase过程可能产生冲突,而且可能需要解决多次

删除一个未上传的提交



注意点:

  • Rebase时log显示是按修改的顺序显示的,和git log 显示刚好是相反的
  • Rebase完以后编辑器里面最少需要保留一行有效内容,否则不会进行rebase
  • 适合某个commit,在走读以后发现是不需要修改的

修改非最后一个提交

注意点:

  • 这个方案适合走读发现的小问题修改,适合少量的代码修改。
  • 大量的代码修改,建议把要修改的内容变成一个commit,然后合并到原来的commit

合并本地未上传的提交





注意点:

  • 只能合并到未上传的commit
  • 如果多个提交合并到一个提交也是同理的,把要合并的commit按顺序移动到待合并的commit后面,要合并的commit前面的pick都修改成f,然后保存退出
  • Rebase过程可能出现冲突,此时需要修改冲突然后执行”git add . “ 和”git rebase –continue”

已经commit未push的提交,不小心reset掉了,怎么找回来

操作步骤及注意事项:

  • 根据后面的commit_msg找到对应的commit
  • 执行命令git cherry-pick commit_id
  • 各种rebase操作错误的时候,也可以利用git reflog,找到rebase之前的commit,然后执行git reset –hard commit_id (这个会丢弃本地未commit的修改内容)

把自己的修改内容合并到别人的commit里面去了



操作步骤及注意事项

  • 根据后面的commit_msg找到对应的comit
  • git reset –soft commit_id

从gerrit获取别人提交的commit


操作步骤及注意事项

  • 从gerrit查看到要下载的commit的commit_id
  • 执行命令git ls-remote | grep 66e1d6ec3597,获取要下载commit在gerrit的路径
  • 执行命令 git pull –rebase origin refs/changes/06/3306/1, 将要下载的commit rebase到本地
  • 要下载的commit 所依赖的其它commit都会同时下载下来,走读时可只下载最后的commit

常见错误

  • git pull –rebase,出现冲突时,解决后不知道执行git rebase –continue
  • git cherry-pick commit_id 出现冲突时,解决后不知道执行git cherry-pick –continue
  • 出现冲突时,直接切到其它分支