Git的一些總結

.git 目錄結構

|── HEAD|── branches // 分支|── config // 配置|── description // 項目的描述|── hooks // 鉤子| |── pre-commit.sample| |── pre-push.sample| └── ...|── info| └── exclude // 類似.gitignore 用于排除文件|── objects // 存儲了blob,tree,commit對象| |── info| └── pack // 用于優化倉庫體積,通過patch的方式└── refs |── heads└── tags // 標簽
復制代碼

blob,tree,commit對象

blob

blob對象是文件內容的快照

$ git cat-file -t e0f5c6
blob$ git cat-file -p e0f5c6
reademe
復制代碼

tree

tree對象描述了工作目錄,每個節點指向對應的blob或者子tree

$ git cat-file -t 443322
tree$ git cat-file -p 443322
100644 blob 723ef36f4e4f32c4560383aa5987c575a30c6535    .gitignore
100644 blob 56a6051ca2b02b04ef92d5150c9ef600403cb1de    1
100644 blob d218c7660f5672293d2b2241741f2e3f25008b9e    2
040000 tree 74080098daf8a1fa7368c2feac12cfab0e648d02    3
100644 blob e0f5c6d282792ef63ea012f200f5d7749b084fa0    README.md
復制代碼

commit

commit對象是對tree的封裝

$ git cat-file -t 186f17807d
commit$ git cat-file -p 186f17807d
tree 4433224cb7cbb72dae00b5138c8961522c531707
parent 45d0db32885c40a8c3244fa6ec24df2d7a631a3c
author 孫健 <jian.sun@ymm56.com> 1535621955 +0800
committer 孫健 <jian.sun@ymm56.com> 1535621955 +0800
復制代碼

擴展 - 手動創建 commit

mktree // 從標準格式文本中創建一個樹read-tree // 從倉庫中讀取到 index 文件ls-files -s // 檢查當前 index 文件的結構write-tree // 通過這個 index 在倉庫中創建一個樹commit-tree // 將一個 tree 包裝為 commit 對象-p 指定父commit-m 添加描述branch -f master HEAD // 更改分支指向
復制代碼

工作區和暫存區

工作區

工作區就是我們的工作目錄

暫存區

暫存區類似一個 tree 對象

$ git ls-files -s
100644 723ef36f4e4f32c4560383aa5987c575a30c6535 0       .gitignore
100644 56a6051ca2b02b04ef92d5150c9ef600403cb1de 0       1
100644 d218c7660f5672293d2b2241741f2e3f25008b9e 0       2
100644 00750edc07d6415dcc07ae0351e9397b0222b7ba 0       3/3
100644 e0f5c6d282792ef63ea012f200f5d7749b084fa0 0       README.md
復制代碼

當我們clone一個倉庫,或者檢出一個提交``的時候,此時HEAD == 暫存區 == 工作區

  • 工作區修改,未添加到暫存區 - HEAD == 暫存區 != 工作區

  • 工作區修改,添加到暫存區 - HEAD != 暫存區 == 工作區

  • 工作區修改,添加到暫存區,提交到倉庫 - HEAD == 暫存區 == 工作區 - nothing to commit, working tree clean

add的時候做了什么

  • 從文件中創建 blob

  • 將 blob 寫入倉庫

  • 更新 index

Commit的時候 做了什么

  • 從 index 文件創建 tree
  • 將 tree 寫入倉庫
  • 創建一個 commit 對象將樹封裝起來
  • 將 HEAD 作為新創建 commit 的父 commit,并更新 HEAD 未新創建的 commit

擴展:從一個 tree 更新工作區

$ git read-tree $TREE_HASH // 從一個 tree 寫入到 index
$ git checkout-index -a // 從 index 檢出到工作區
復制代碼

分支,標簽,HEAD

branch

# refs/heads/dev
47c871bb634324cfcc41e5a5affee6aa35301e03 // branch總是指向最新的提交$ git cat-file -t 47c871b
commit
復制代碼

標簽

# refs/tags/dev
47c871bb634324cfcc41e5a5affee6aa35301e03 // tag指向固定的提交// 同上
復制代碼

HEAD

# HEAD
ref: refs/heads/dev 此時HEAD隨分支前進$ git checkout HEAD^
# HEAD
47c871bb634324cfcc41e5a5affee6aa35301e03 分離HEAD,不隨分支前進// 同上
復制代碼

merge

merge 常用于將兩條分支合并;

略過快速合并

標準的三方合并

上圖:

after:

此時,你的開發歷史從一個更早的地方開始分叉開來(diverged)。 因為,master 分支所在提交并不是 iss53 分支所在提交的直接祖先,Git 不得不做一些額外的工作。 出現這種情況的時候,Git 會使用兩個分支的末端所指的快照(C4C5)以及這兩個分支的工作祖先(C2),做一個簡單的三方合并。

我們分析一下兩條分支合并的過程
  • 找到兩條分支對應的commit對象;
  • 找到兩個commit對象共同的祖先commit對象;
  • 通過兩個commit對象下的tree對象對比每個blob對象的差異;
    • 如果不同并且其中一個blob對象與祖先相同,則默認自動合并;
    • 如果不同并且都不與祖先相同
      • 修改同一處地方 產生conflict,需要手動合并
      • 沒有修改同一處地方 自動合并
查看合并基底
$ git merge-base master iss53
// C2的HASH_ID
復制代碼
合并
* master
$ git merge iss53
// 此時產生沖突$ git merge --abort // 撤銷合并
$ git commit -a // 解決沖突后,提交
復制代碼
查看沖突
$ git show :1:hello.rb > hello.common.rb // 祖先
$ git show :2:hello.rb > hello.ours.rb // 我
$ git show :3:hello.rb > hello.theirs.rb // 他$ git ls-files -u
復制代碼

小技巧

1.有時候我們格式化文件之后,在之后的合并中會產生很多沖突,有沒有辦法忽略空格上的更改嗎?

git merge [branch] --ignore-space-change
git merge [branch] -s recursive -X ignore-space-change-s 選擇策略-x 策略選項
復制代碼

2.通過revert撤銷合并,后面再次merge的時候提示已經合并過了?

再次revert,或者通過新建一個相同的commit,指定其父commit;

$ git commit-tree $TREE_HASH -p $PARENT_HASH // 需要合并的 commit 的tree hash 和其parent hash
$ git branch -f $BRANCH $NEW_COMMIT_HASH // 將分支指向新的 commit
$ git merge $branch // 此時合并就沒問題了
復制代碼

rebase

繼續上圖:

after:

首先回到兩個分支最近的共同祖先,根據當前分支(也就是要進行衍合的分支 experiment)后續的歷次提交對象(這里只有一個 C4),生成一系列文件補丁;

然后以基底分支(也就是主干分支master)最后一個提交對象(C3)為新的出發點,逐個應用之前準備好的補丁文件;

最后會生成一個新的合并提交對象(C4'),從而改寫 experiment 的提交歷史,使它成為 master 分支的直接下游

需要注意的點

  • rebase是逐步應用補丁,可能會有多個rebase階段,每次解決沖突都需要:

    $ git add .
    $ git rebase --continue
    復制代碼
  • rebase完成之后會丟失之前的對C4的指向,導致C4無法再被找到,此時C4存在于.git/objects中,等待下次gc被回收;

  • rebase類似于多個merge過程,比如已被應用的補丁產生的新的提交會與下一個補丁進行新的三方合并;

黃金準則 - 公用分支不可作為衍合分支

上圖:

rebase的濫用可能會導致混亂的提交歷史


交互式rebase

$ git rebase -i HEAD~6pick fb257ad9 某次提交說明
pick fb257ad9 某次提交說明
drop fb257ad9 某次提交說明# Rebase a0daba3d..fb257ad9 onto a0daba3d (1 command)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending // 修改某次commit
# s, squash <commit> = use commit, but meld into previous commit // 將commit合并到上一個commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit // 刪除某次commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
復制代碼
  • 如果之前錯誤的合并了某次提交,可以通過drop刪除該提交
  • 如果想修改某次提交的信息,可以將該提交對應的狀態改為edit

cherry-pick - 摘櫻桃

cherry-pick常用于將某些提交應用于其他的分支;

cherry-pick可以理解為”挑揀”提交,它會獲取某一個分支的單筆提交,并作為一個新的提交引入到你當前分支上。 當我們需要在本地合入其他分支的提交時,如果我們不想對整個分支進行合并,而是只想將某一次提交合入到本地當前分支上,那么就要使用cherry-pick了。


# cherry-pick的方式與 merge 有所不同,merge 的過程相當于兩個 tree 的差異對比,而cherry-pick更像是應用更改;C<---D<---E  branch2/
master   A<---B  \F<---G<---H  branch3|HEAD*** after ***C<---D<---E<---F'<---G'<---H' branch2/
master   A<---B  \F<---G<---H  branch3|HEAD  復制代碼

當我們應用某個提交的時候,實際上會通過該提交與其父提交的差異得到發生的改變,并將這些改變應用到主分支上,cherry-pick產生的三方合并,其merge-base是該提交的父提交;

* branch2
$ git cherry-pick B...H // 三點語法,前開后閉第一次 base:B our:E their: F 產生提交 F'
第二次 base:F our:F' their: G 產生提交 G'
第三次 base:G our:G' their: H 產生提交 H'
復制代碼

轉載于:https://juejin.im/post/5b8907c851882542d14da61c

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389789.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389789.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389789.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025. 分割數組的最多方案數

2025. 分割數組的最多方案數 給你一個下標從 0 開始且長度為 n 的整數數組 nums 。分割 數組 nums 的方案數定義為符合以下兩個條件的 pivot 數目&#xff1a; 1 < pivot < nnums[0] nums[1] … nums[pivot - 1] nums[pivot] nums[pivot 1] … nums[n -1] 同時…

您是六個主要數據角色中的哪一個

When you were growing up, did you ever play the name game? The modern data organization has something similar, and it’s called the “Bad Data Blame Game.” Unlike the name game, however, the Bad Data Blame Game is played when data downtime strikes and no…

命令查看linux主機配置

查看cpu&#xff1a; # 總核數 物理CPU個數 X 每顆物理CPU的核數 # 總邏輯CPU數 物理CPU個數 X 每顆物理CPU的核數 X 超線程數# 查看物理CPU個數 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l# 查看每個物理CPU中core的個數(即核數) cat /proc/cpui…

C#中全局處理異常方式

using System; using System.Configuration; using System.Text; using System.Windows.Forms; using ZB.QueueSys.Common;namespace ZB.QueueSys {static class Program{/// <summary>/// 應用程序的主入口點。/// </summary>[STAThread]static void Main(){Appli…

5911. 模擬行走機器人 II

5911. 模擬行走機器人 II 給你一個在 XY 平面上的 width x height 的網格圖&#xff0c;左下角 的格子為 (0, 0) &#xff0c;右上角 的格子為 (width - 1, height - 1) 。網格圖中相鄰格子為四個基本方向之一&#xff08;“North”&#xff0c;“East”&#xff0c;“South”…

自定義按鈕動態變化_新聞價值的變化定義

自定義按鈕動態變化I read Bari Weiss’ resignation letter from the New York Times with some perplexity. In particular, I found her claim that she “was hired with the goal of bringing in voices that would not otherwise appear in your pages” a bit strange: …

Linux記錄-TCP狀態以及(TIME_WAIT/CLOSE_WAIT)分析(轉載)

1.TCP握手定理 2.TCP狀態 l CLOSED&#xff1a;初始狀態&#xff0c;表示TCP連接是“關閉著的”或“未打開的”。 l LISTEN &#xff1a;表示服務器端的某個SOCKET處于監聽狀態&#xff0c;可以接受客戶端的連接。 l SYN_RCVD &#xff1a;表示服務器接收到了來自客戶端請求…

677. 鍵值映射

677. 鍵值映射 實現一個 MapSum 類&#xff0c;支持兩個方法&#xff0c;insert 和 sum&#xff1a; MapSum() 初始化 MapSum 對象 void insert(String key, int val) 插入 key-val 鍵值對&#xff0c;字符串表示鍵 key &#xff0c;整數表示值 val 。如果鍵 key 已經存在&am…

算法 從 數中選出_算法可以選出勝出的nba幻想選秀嗎

算法 從 數中選出Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works without …

jQuery表單校驗

小小Demo&#xff1a; <script>$(function () {//給username綁定失去焦點事件$("#username").blur(function () {//得到username文本框的值var nameValue $(this).val();//每次清除數據$("table font:first").remove();//校驗username是否合法if (n…

5912. 每一個查詢的最大美麗值

5912. 每一個查詢的最大美麗值 給你一個二維整數數組 items &#xff0c;其中 items[i] [pricei, beautyi] 分別表示每一個物品的 價格 和 美麗值 。 同時給你一個下標從 0 開始的整數數組 queries 。對于每個查詢 queries[j] &#xff0c;你想求出價格小于等于 queries[j] …

django-rest-framework第一次使用使用常見問題

2019獨角獸企業重金招聘Python工程師標準>>> 記錄在第一次使用django-rest-framework框架使用時遇到的問題&#xff0c;為了便于理解在這里創建了Person和Grade這兩個model from django.db import models class Person(models.Model):SHIRT_SIZES ((S, Small),(M, …

插入腳注把腳注標注刪掉_地獄司機不應該只是英國電影歷史數據中的腳注,這說明了為什么...

插入腳注把腳注標注刪掉Cowritten by Andie Yam由安迪(Andie Yam)撰寫 Hell Drivers”, 1957地獄司機 》電影海報 Data visualization is a great way to celebrate our favorite pieces of art as well as reveal connections and ideas that were previously invisible. Mor…

vue之axios 登陸驗證及數據獲取

登陸驗證&#xff0c;獲取token methods:{callApi () {var vm thisvm.msg vm.result //驗證地址vm.loginUrl http://xxx///查詢地址vm.apiUrl http://yyy/vm.loginModel {username: 你的用戶名,password: 你的密碼,// grant_type: password,}//先獲取 tokenaxios.post(v…

5926. 買票需要的時間

5926. 買票需要的時間 有 n 個人前來排隊買票&#xff0c;其中第 0 人站在隊伍 最前方 &#xff0c;第 (n - 1) 人站在隊伍 最后方 。 給你一個下標從 0 開始的整數數組 tickets &#xff0c;數組長度為 n &#xff0c;其中第 i 人想要購買的票數為 tickets[i] 。 每個人買票…

貝葉斯統計 傳統統計_統計貝葉斯如何補充常客

貝葉斯統計 傳統統計For many years, academics have been using so-called frequentist statistics to evaluate whether experimental manipulations have significant effects.多年以來&#xff0c;學者們一直在使用所謂的常客統計學來評估實驗操作是否具有significant效果。…

吳恩達機器學習+林軒田機器學習+高等數學和線性代數等視頻領取

機器學習一直是一個熱門的領域。這次小編應大家需求&#xff0c;整理了許多相關學習視頻和書籍。本次分享包含&#xff1a;臺灣大學林軒田老師的【機器學習基石】和【機器學習技法】視頻教學、吳恩達老師的機器學習分享、徐小湛的高等數學和線性代數視頻&#xff0c;還有相關機…

saltstack二

配置管理 haproxy的安裝部署 haproxy各版本安裝包下載路徑https://www.haproxy.org/download/1.6/src/&#xff0c;跳轉地址為http&#xff0c;改為https即可 創建相關目錄 # 創建配置目錄 [rootlinux-node1 ~]# mkdir /srv/salt/prod/pkg/ [rootlinux-node1 ~]# mkdir /srv/sa…

319. 燈泡開關

319. 燈泡開關 初始時有 n 個燈泡處于關閉狀態。第一輪&#xff0c;你將會打開所有燈泡。接下來的第二輪&#xff0c;你將會每兩個燈泡關閉一個。 第三輪&#xff0c;你每三個燈泡就切換一個燈泡的開關&#xff08;即&#xff0c;打開變關閉&#xff0c;關閉變打開&#xff0…

如何生成隨機不重復的11位數字

要求 不重復隨機11位數字不占存儲我們都知道11位數字(random)對應有最大值max和最小值min99999999999和10000000000.很簡單的從最小值開始按順序分發到最大值&#xff0c;就滿足了不重復&#xff0c;不占存儲&#xff0c;11位數字的特性。那么接下來就要考慮如何生成隨機數字這…