大部分的知识点都可以在Git权威指南和git官方文档中找到。
本文为工作过程中,知识点记录。
一、 git相关
1.分支的恢复
【git】误删除了本地和远程开发分支,怎么找回,怎么恢复远程分支和本地分支?
git reflog show --date=iso
git checkout -b 要恢复的分支名 commitId
2.HEAD
http://www.worldhello.net/gotgit/02-git-solo/050-git-checkout.html#head
HEAD可以理解为“头指针”,是当前工作区的“基础版本”,当执行提交时,HEAD指向的提交将作为新提交的父提交。看看当前HEAD的指向。
查看git文件夹下的HEAD内容
$ cat .git/HEAD
ref: refs/heads/master
可以看出HEAD指向了分支 master。此时执行git branch会看到当前处于master分支。
$ git branch -v
* master 4902dc3 does master follow this new commit?
现在使用git checkout命令检出该ID的父提交,看看会怎样。
$ git checkout 4902dc3^
Note: checking out '4902dc3^'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
HEAD is now at e695606... which version checked in?
您现在处于 '分离头指针' 状态。您可以检查、测试和提交,而不影响任何分支。
通过执行另外的一个 checkout 检出指令会丢弃在此状态下的修改和提交。
如果想保留在此状态下的修改和提交,使用 -b 参数调用 checkout 检出指令以
创建新的跟踪分支。如:
git checkout -b new_branch_name
头指针现在指向 e695606... 提交说明为: which version checked in?
什么叫做“分离头指针”状态?查看一下此时HEAD的内容就明白了。
$ cat .git/HEAD
e695606fc5e31b2ff9038a48a3d363f4c21a3d86
原来“分离头指针”状态指的就是HEAD头指针指向了一个具体的提交ID,而不是一个引用(分支)。
git的提交,要在分支上去做。如果HEAD不指向分支,HEAD处于“分离头指针”模式。
$ git status
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: detached-commit.txt
#
需要使用checkout 切换到分支上。
$ git checkout master
- git push origin HEAD:refs/for/master
git push <remote 名字> <本地分支的名字> : <远程库的名字>
git push origin HEAD:refs/for/master
git push 肯定是推送
origin : 是远程的库的名字
HEAD: 是一个特别的指针,它是一个指向你正在工作的本地分支的指针,可以把它当做本地分支的别名,git这样就可以知道你工作在哪个分支
refs/for :意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的
refs/heads 不需要
git push origin HEAD:refs/for/master 的意思
- 修改某次提交
git commit --amend
git高级浅入之当我们需要修改某次commit信息
Git如何修改一个过去的Commit
- 分支管理
- HEAD~和HEAD^
- 打补丁
Git 打补丁-- patch 和 diff 的使用(详细)
git apply、git am打补丁.diff 和 .patch
- cherry-pick 合并某个分支上的修改到另一个分支
git cherry-pick使用
首先要保证代码同步到最新。commit之前也是一样,代码拉到最新版本能很大程度减少冲突的产生,可先使用git stash
暂存。
首先在分支A上找到提交的commit id(例如这里是55e1c39e)。
然后切换到分支B上。
使用git cherry-pick 55e1c39e。此时在分支B上就同步了分支A上的提交。
然后 fetch ,然后再使用git push origin B到远程。
如果cherry-pick后无法push的话先撤销cherry-pick的提交。然后再同步下代码,然后再cherry-pick,最后再push到远程。
合并时冲突参考这个:
git合并时冲突<<<<<<< HEAD
git丢弃修改
Git恢复之前版本的两种方法reset、revert(图文详解)
在已经push的情况下修改commit message 以及撤回
Git 丢弃本地修改
Git丢弃修改git rebase
11.master 和 origin/master
对 Git 分支 master 和 origin/master 的一些认识
- 代码同步
二、repo相关
1.Repo和Gerrit
Repo:用Python语言开发名为repo的命令行工具用于多版本库的管理
Gerrit:用Java开发的名为Gerrit的代码审核服务器
4.6. Android式多版本库协同
Repo是Google开发的用于管理Android版本库的一个工具。Repo并不是用于取代Git,是用Python对Git进行了一定的封装,简化了对多个Git版本库的管理。对于repo管理的任何一个版本库,都还是需要使用Git命令进行操作。
repo的使用过程大致如下:
运行repo init命令,克隆Android的一个清单库。这个清单库和前面假设的“子模组”方式工作的索引库不同,是通过XML技术建立的版本库清单。
清单库中的 manifest.xml 文件,列出了160多个版本库的克隆方式。包括版本库的地址和工作区地址的对应关系,以及分支的对应关系。
运行repo sync命令,开始同步,即分别克隆这160多个版本库到本地的工作区中。
同时对160多个版本库执行切换分支操作,切换到某个分支。
2.push到gerrit失败
push remote rejected
Gerrit: remote rejected HEAD->refs/for/master (change closed) 的问题
Git push remote rejected {change ### closed}
还有要注意是否Abandon某次提交,Abandon之后也是无法push的。
- 切换manifest和分支
manifest存放代码仓。
一般开发不在主线上,拉完代码后要注意要先切换manifest,再切分支。
查看当前使用的manifest.
ll .repo/
查看当前repo环境存在的manifest.xml
ll .repo/manifests
切换到需要的manifest上.
repo init -m xxx.xml
然后开个本地分支,切换过去。
repo start newbranchname --all
repo start命令实际上是对git checkout -b命令的封装。为指定的项目或者所有项目(若使用--all参数),以清单文件中为项目设定的分支或里程碑为基础,创建特性分支。特性分支的名称由命令的第一个参数指定。相当于执行git checkout -b(创建、切换分支)。
repo checkout
命令实际上是对git checkout命令的封装
repo branches
命令读取各个项目的分支列表并汇总显示。
- repo命令
4.6.7. Repo的命令集
repo相关命令