主頁 > 區塊鏈 > git:將滯后分支合并到當前分支

git:將滯后分支合并到當前分支

2021-11-07 10:06:47 區塊鏈

通常,當我們必須在當前分支(mybranch)上合并其他一些分支(branch-to-merge)時,我們會這樣做:

git checkout mybranch
git pull origin branch-to-merge

我理解它的作業方式是它將 mybranch 指標移動到與分支合并頭相同的提交。如果是線性場景,一切順利,否則我們需要解決合并沖突。

但是如果分支到合并在 mybranch 后面,它會如何發揮作用?我基本上想將分支到合并中的更改(它是滯后的)集成到我當前的功能分支中,以利用分支到合并中所做的代碼更改。

uj5u.com熱心網友回復:

TL;DR:什么也沒有發生(Git 說Already up to date.并在成功退出時停止)。

您的理解并非完全錯誤,但缺少一兩個關鍵細節,這會導致問題:

git checkout mybranch
git pull origin branch-to-merge

... 將 mybranch 指標移動到與分支合并頭相同的提交。

讓我們在這里精確一點。git checkout mybranch步驟:

  • 當前提交中洗掉任何檔案(在 Git 的索引aka staging area 中記得);
  • 從名稱指示的提交中提取檔案mybranch
  • 使mybranch當前分支。

(或者,當然,它可能會因各種錯誤情況而失敗,但我們可以假設這些不會發生。它也可以在保留未提交的作業的同時成功,如當前分支上有未提交的更改時檢查另一個分支中所述:當它可以跳過特定檔案的洗掉和替換時發生,Git 通常出于速度原因嘗試這樣做,無論這些檔案中是否有未提交的作業)。

完成此結帳后,然后運行git pull. pull命令是另外兩個 Git 命令的組合:

  1. git pull運行git fetch在舊版本的 Git 中,它實際上是這樣做的(它是一個 shell 腳本,它實際上使用各種引數運行 git fetch)。在目前的Git中,這是內置在pull程式中的,但是效果是一樣的。此步驟獲取origin您的存盤庫缺少的任何提交(一個單獨的 Git 存盤庫)。origin/branch-to-merge在正常情況下,此步驟還會更新您自己的存盤庫中的名稱

  2. git pull然后運行您撰寫的第二個命令來運行。如果您尚未設定任何內容,則默認為 using git merge,但您可以將其設定為 run git rebase與 fetch 步驟一樣,舊腳本確實運行了這些;新的 C 代碼內置了它們,但效果是一樣的。傳遞 git mergeor的引數git rebase有點復雜,但是如果我們假設你在git merge這里使用,并且其他東西都是正常的,我們就會得到運行的效果git merge origin/branch-to-merge(默認提交訊息除外)。但您也可以git merge --no-ff在此處或現在使用git merge --ff-only. 如果您將其git rebase用作第二個命令,則圖片會更加復雜。

如果是線性場景,一切順利,否則我們需要解決合并沖突。

這有許多棘手的細節和極端情況。git merge命令在多種場景下運行,并帶有各種引數 ( --no-ff, --ff-only),每個引數都有不同的效果。但總的來說,我們可以將合并描述為這樣作業:

  • 首先,Git 確保我們有一個“干凈”的作業樹(一些合并情況不會檢查,但如果您使用這些奇怪的合并變體之一,確保自己就是這種情況是一個非常好的主意)。Git 然后使用當前分支名稱 from或原始哈希 ID from定位當前提交哈希 ID 如果發生合并沖突,這就是“HEAD”或“我們的”提交。HEADHEAD

  • Git 還會將引數指定的提交定位到git merge. 也就是說,origin/branch-to-merge轉換為原始提交哈希 ID。Git 找到了這個特定的提交。

  • Git 然后使用提交圖計算兩個提交合并基數(請參閱有向無環圖的最低公共祖先)。就確定合并結果而言,這是在某些方面最重要的提交。

我們可以通過多種方式繪制合并基礎。例如,假設我們有這個:

          o--L   <-- mybranch (HEAD)
         /
...--o--*
         \
          o--R   <-- origin/branch-to-merge

Here, the name mybranch locates commit L, the "left side" or "local" or HEAD or ours commit. The name origin/branch-to-merge locates commit R: the other, or "right side" or "remote" or --theirs commit. The commit marked * is the best common ancestor, so commit * is the merge base.

This kind of merge requires a true merge. It may produce a merge conflict, but if it does not, and if a true merge is permitted, the result of this merge is a new merge commit M:

          o--L
         /    \
...--o--*      M   <-- mybranch (HEAD)
         \    /
          o--R   <-- origin/branch-to-merge

Because this commit is made while "on" mybranch (in that git status says on branch mybranch), the branch name mybranch now points to merge commit M.

If there are merge conflicts, Git stops in the middle of the merge, with all three commits read into Git's index, and the merge partly resolved and partly unresolved. Your job as the human operating Git is to finish the merge, which cleans up the mess Git left behind; or you may choose to run git merge --abort to throw away the partial result, cleaning up the mess by, in essence, resetting to commit L. (This usually goes quite badly if you start a "dirty" merge and then use git merge --abort, which is why you should not start a "dirty" merge in the first place.)

If a true merge is required and you specified --ff-only, git merge does not even start the merge: it just says that a fast-forward is impossible and terminates with an error.

Another scenario is illustrated by this drawing:

...--o--L   <-- mybranch (HEAD)
         \
          o--R   <-- origin/branch-to-merge

Here, the "merge base"—the best shared commit that is reachable from both commits L and R—is commit L. This is your linear scenario: Git can simply "move the branch name forward" while also checking out commit R, resulting in:

...--o--L--o--R   <-- mybranch (HEAD), origin/branch-to-merge

This is the default action if you specified --ff-only or did not use --no-ff. However, if you specified --no-ff, Git will go ahead and do a full merge anyway:

...--o--L------M   <-- mybranch (HEAD)
         \    /
          o--R   <-- origin/branch-to-merge

Commit M is a merge commit as before. The snapshot for commit M will match that for commit R, since the merge commit snapshot is made by combining the changes from the merge base (L) to each tip commit (L and R respectively). The changes from L to L are empty, so this produces the changes found from L to R. Git applies those changes to the snapshot in the merge base—i.e., in L—which produces a snapshot that matches commit R. Git then commits the result, as there were no merge conflicts.

But how does it play out if branch-to-merge is behind mybranch?

Note that in one case we already drew:

          o--L   <-- mybranch (HEAD)
         /
...--o--*
         \
          o--R   <-- origin/branch-to-merge

it is the case that origin/branch-to-merge is behind mybranch. It's just that, in spite of being behind by two commits, origin/branch-to-merge is also ahead by two commits. That is, there are two commits, those along the bottom line, that are "on" (reachable from) commit R that are not "on" (not reachable from) commit L.

Let's draw this other case though:

...--o--R   <-- origin/branch-to-merge
         \
          o--L   <-- mybranch (HEAD)

Here, the merge base of L and R is R. Merging is not possible: the diff from R to R is empty, and applying the diff from R to L produces the snapshot in L. Git could still do the same kind of "forced merge" it does when R is strictly ahead of L, but Git won't do that. Instead it just says that it is already up to date.

The bottom line

The merge command:

  1. locates the commits to merge (let's call them L and R for the two-commit case);
  2. locates the merge base (let's call this B); and
  3. uses this to drive the rest of the action.

For a standard two-head merge with recursive or resolve, there are three possibilities, considered in this order:

  • B = R: emit "up to date" message and terminate with success.
  • B = L: consider doing a fast-forward instead of a merge. If allowed, check out commit R, update the stored hash ID in the current branch, and terminate with success.
  • Otherwise, if allowed (no --ff-only), do a full merge. If this is successful (and neither --no-commit nor --squash were specified), make a new merge commit, otherwise stop. For --squash, don't record the hash ID of R in MERGE_HEAD; for other merges, do record the hash ID of R in MERGE_HEAD.

In the special case that B = L = R, we do the B=R test first and say "up to date". The --no-ff option simply forces the middle test to fail so that we go on to the third case.

The --squash option ensures that merge commit M has only a single parent. (It does this by terminating the merge early, as if -n had been specified, which is kind of stupid: you could just run git merge -n --squash if you really wanted that, and it could just make the final commit as a non-merge commit when not using -n, and then declare the merge done.) The -n option ensures that Git doesn't make the final commit right away, which allows you to create an evil merge if you wish.

How to see the merge base

If you're good at eyeballing Git graphs (see Pretty Git branch graphs) you may be able to spot the merge base just by looking, but a lot of graphs are horribly tangled. You can run git merge-base --all:

git fetch
git merge-base --all mybranch origin/branch-to-merge

The second command spits out hash IDs. Ideally, it spits out just one hash ID: that one hash ID is the merge base, and all goes simply from there.

If this prints two or more hash IDs, you have a complex merge. The default (-s recursive, or now, -s ort) strategies will merge the merge bases, creating a new but temporary commit from the result, and then use the result as the merge base. This is simple in theory, but hard to comprehend and even harder to describe well. It's also pretty rare, so you probably won't encounter it.

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/351146.html

標籤:混帐

上一篇:盡管提交,Git創建了一個新分支......如何解決這個問題?

下一篇:如何在不縮進的情況下獲取git日志條目?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more