git和repo知识点记录

大部分的知识点都可以在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
  1. 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 的意思

  1. 修改某次提交
    git commit --amend
    git高级浅入之当我们需要修改某次commit信息
    Git如何修改一个过去的Commit
  1. 分支管理

Git分支管理实践

  1. HEAD~和HEAD^

git在回退版本时HEAD~和HEAD^的作用和区别

  1. 打补丁

Git 打补丁-- patch 和 diff 的使用(详细)
git apply、git am打补丁.diff 和 .patch

  1. cherry-pick 合并某个分支上的修改到另一个分支
    git cherry-pick使用

首先要保证代码同步到最新。commit之前也是一样,代码拉到最新版本能很大程度减少冲突的产生,可先使用git stash暂存。

首先在分支A上找到提交的commit id(例如这里是55e1c39e)。

image.png

然后切换到分支B上。
使用git cherry-pick 55e1c39e。此时在分支B上就同步了分支A上的提交。

然后 fetch ,然后再使用git push origin B到远程。

如果cherry-pick后无法push的话先撤销cherry-pick的提交。然后再同步下代码,然后再cherry-pick,最后再push到远程。

合并时冲突参考这个:
git合并时冲突<<<<<<< HEAD

GIT:cherry-pick挑拣提交

  1. git丢弃修改
    Git恢复之前版本的两种方法reset、revert(图文详解)
    在已经push的情况下修改commit message 以及撤回
    Git 丢弃本地修改
    Git丢弃修改

  2. git rebase

【Git】rebase 用法小结

11.master 和 origin/master
对 Git 分支 master 和 origin/master 的一些认识

  1. 代码同步

Git: 四種將分支與主線同步的方法

二、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的。

  1. 切换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
命令读取各个项目的分支列表并汇总显示。

  1. repo命令
    4.6.7. Repo的命令集
    repo相关命令
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容