git和repo知識(shí)點(diǎn)記錄

大部分的知識(shí)點(diǎn)都可以在Git權(quán)威指南git官方文檔中找到。
本文為工作過程中,知識(shí)點(diǎn)記錄。

一、 git相關(guān)
1.分支的恢復(fù)
【git】誤刪除了本地和遠(yuǎn)程開發(fā)分支,怎么找回,怎么恢復(fù)遠(yuǎn)程分支和本地分支?

git reflog show --date=iso
git checkout -b  要恢復(fù)的分支名  commitId

2.HEAD

http://www.worldhello.net/gotgit/02-git-solo/050-git-checkout.html#head
HEAD可以理解為“頭指針”,是當(dāng)前工作區(qū)的“基礎(chǔ)版本”,當(dāng)執(zhí)行提交時(shí),HEAD指向的提交將作為新提交的父提交??纯串?dāng)前HEAD的指向。

查看git文件夾下的HEAD內(nèi)容

$ cat .git/HEAD
ref: refs/heads/master

可以看出HEAD指向了分支 master。此時(shí)執(zhí)行g(shù)it branch會(huì)看到當(dāng)前處于master分支。

$ git branch -v
* master 4902dc3 does master follow this new commit?

現(xiàn)在使用git checkout命令檢出該ID的父提交,看看會(huì)怎樣。

$ 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?
您現(xiàn)在處于 '分離頭指針' 狀態(tài)。您可以檢查、測(cè)試和提交,而不影響任何分支。
通過執(zhí)行另外的一個(gè) checkout 檢出指令會(huì)丟棄在此狀態(tài)下的修改和提交。

如果想保留在此狀態(tài)下的修改和提交,使用 -b 參數(shù)調(diào)用 checkout 檢出指令以
創(chuàng)建新的跟蹤分支。如:

  git checkout -b new_branch_name

頭指針現(xiàn)在指向 e695606... 提交說明為: which version checked in?

什么叫做“分離頭指針”狀態(tài)?查看一下此時(shí)HEAD的內(nèi)容就明白了。

$ cat .git/HEAD
e695606fc5e31b2ff9038a48a3d363f4c21a3d86

原來(lái)“分離頭指針”狀態(tài)指的就是HEAD頭指針指向了一個(gè)具體的提交ID,而不是一個(gè)引用(分支)。

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 名字> <本地分支的名字> : <遠(yuǎn)程庫(kù)的名字>
git push origin HEAD:refs/for/master
git push 肯定是推送
origin : 是遠(yuǎn)程的庫(kù)的名字
HEAD: 是一個(gè)特別的指針,它是一個(gè)指向你正在工作的本地分支的指針,可以把它當(dāng)做本地分支的別名,git這樣就可以知道你工作在哪個(gè)分支
refs/for :意義在于我們提交代碼到服務(wù)器之后是需要經(jīng)過code review 之后才能進(jìn)行merge的
refs/heads 不需要

git push origin HEAD:refs/for/master 的意思

  1. 修改某次提交
    git commit --amend
    git高級(jí)淺入之當(dāng)我們需要修改某次commit信息
    Git如何修改一個(gè)過去的Commit
  1. 分支管理

Git分支管理實(shí)踐

  1. HEAD~和HEAD^

git在回退版本時(shí)HEAD~和HEAD^的作用和區(qū)別

  1. 打補(bǔ)丁

Git 打補(bǔ)丁-- patch 和 diff 的使用(詳細(xì))
git apply、git am打補(bǔ)丁.diff 和 .patch

  1. cherry-pick 合并某個(gè)分支上的修改到另一個(gè)分支
    git cherry-pick使用

首先要保證代碼同步到最新。commit之前也是一樣,代碼拉到最新版本能很大程度減少?zèng)_突的產(chǎn)生,可先使用git stash暫存。

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

image.png

然后切換到分支B上。
使用git cherry-pick 55e1c39e。此時(shí)在分支B上就同步了分支A上的提交。

然后 fetch ,然后再使用git push origin B到遠(yuǎn)程。

如果cherry-pick后無(wú)法push的話先撤銷cherry-pick的提交。然后再同步下代碼,然后再cherry-pick,最后再push到遠(yuǎn)程。

合并時(shí)沖突參考這個(gè):
git合并時(shí)沖突<<<<<<< HEAD

GIT:cherry-pick挑揀提交

  1. git丟棄修改
    Git恢復(fù)之前版本的兩種方法reset、revert(圖文詳解)
    在已經(jīng)push的情況下修改commit message 以及撤回
    Git 丟棄本地修改
    Git丟棄修改

  2. git rebase

【Git】rebase 用法小結(jié)

11.master 和 origin/master
對(duì) Git 分支 master 和 origin/master 的一些認(rèn)識(shí)

  1. 代碼同步

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

二、repo相關(guān)

1.Repo和Gerrit
Repo:用Python語(yǔ)言開發(fā)名為repo的命令行工具用于多版本庫(kù)的管理
Gerrit:用Java開發(fā)的名為Gerrit的代碼審核服務(wù)器

4.6. Android式多版本庫(kù)協(xié)同
Repo是Google開發(fā)的用于管理Android版本庫(kù)的一個(gè)工具。Repo并不是用于取代Git,是用Python對(duì)Git進(jìn)行了一定的封裝,簡(jiǎn)化了對(duì)多個(gè)Git版本庫(kù)的管理。對(duì)于repo管理的任何一個(gè)版本庫(kù),都還是需要使用Git命令進(jìn)行操作。
repo的使用過程大致如下:
運(yùn)行repo init命令,克隆Android的一個(gè)清單庫(kù)。這個(gè)清單庫(kù)和前面假設(shè)的“子模組”方式工作的索引庫(kù)不同,是通過XML技術(shù)建立的版本庫(kù)清單。
清單庫(kù)中的 manifest.xml 文件,列出了160多個(gè)版本庫(kù)的克隆方式。包括版本庫(kù)的地址和工作區(qū)地址的對(duì)應(yīng)關(guān)系,以及分支的對(duì)應(yīng)關(guān)系。
運(yùn)行repo sync命令,開始同步,即分別克隆這160多個(gè)版本庫(kù)到本地的工作區(qū)中。
同時(shí)對(duì)160多個(gè)版本庫(kù)執(zhí)行切換分支操作,切換到某個(gè)分支。

2.push到gerrit失敗

push remote rejected
Gerrit: remote rejected HEAD->refs/for/master (change closed) 的問題

Git push remote rejected {change ### closed}

還有要注意是否Abandon某次提交,Abandon之后也是無(wú)法push的。

  1. 切換manifest和分支
    manifest存放代碼倉(cāng)。
    一般開發(fā)不在主線上,拉完代碼后要注意要先切換manifest,再切分支。
    查看當(dāng)前使用的manifest.
ll .repo/

查看當(dāng)前repo環(huán)境存在的manifest.xml

ll .repo/manifests

切換到需要的manifest上.

repo init -m xxx.xml

然后開個(gè)本地分支,切換過去。
repo start newbranchname --all

repo start命令實(shí)際上是對(duì)git checkout -b命令的封裝。為指定的項(xiàng)目或者所有項(xiàng)目(若使用--all參數(shù)),以清單文件中為項(xiàng)目設(shè)定的分支或里程碑為基礎(chǔ),創(chuàng)建特性分支。特性分支的名稱由命令的第一個(gè)參數(shù)指定。相當(dāng)于執(zhí)行g(shù)it checkout -b(創(chuàng)建、切換分支)。

repo checkout
命令實(shí)際上是對(duì)git checkout命令的封裝

repo branches
命令讀取各個(gè)項(xiàng)目的分支列表并匯總顯示。

  1. repo命令
    4.6.7. Repo的命令集
    repo相關(guān)命令
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容