簡體   English   中英

Git:如何檢出而不從當前分支中刪除獨占文件

[英]Git: How to checkout without removing exclusive files from current branch

以下是我在git repo中擁有的每個分支的樹

[branch1]
+ boot
  - cmdline.txt
  - config.txt
+ etc
  - fstab

[branch2]
+ etc
  - passwd
  - shadow
  - group

當我檢出branch2branch1中的文件將從工作branch1中刪除,反之亦然。 如何在不從當前分支刪除獨占文件的情況下簽出分支?

這是正常的功能。

您必須添加文件並提交初始分支:

git add .
git commit -m "hello dev of  branch 1"

轉到下一個分支:

git checkout  branch2

並將您的branch1合並到branch2

git merge branch1

沒有一種簡單的方法可以執行您描述的操作,因為它違反了git分支的原則。

git中的分支旨在跟蹤同一內容的不同演變過程。 這並不是說這是唯一可能的用法-git非常靈活-但這是目的,其他任何事情可能也可能不容易做到。

特別是,在包含不同內容的分支之間來回切換以將合並的內容保留在工作樹上並不是一件容易的事[1]。

我建議您退后一步,看看為什么要一個分支具有密碼文件,為什么要另一個分支具有引導目錄和fstab。 了解您要在此處解決的問題后,我們也許可以為該問題提供替代解決方案,以便您可以在其設計中更多地使用git。

至少要使您正在做的事情“工作”(並且我將“工作”加引號,因為它可能會產生一些古怪的副作用),您可能想要:

  • 在每個分支上,將該分支中排除的文件添加到.gitignore
  • 在切換到包含當前分支上未包含文件的分支之前,您可能必須刪除這些文件的工作副本。 (在簡單的兩分支示例中,您可以使用git clean -x進行此操作,但是請注意,這還會清除其他所有被忽略的工作樹文件-例如生成構件,然后必須重新生成它們。)
  • 切換到不包含當前分支上文件的分支后,請從當前分支中git checkout HEAD@{1} -- ets/fstab這些文件( git checkout HEAD@{1} -- ets/fstab等)

坦白說,對於“大多數時候基本上都能正常工作”的解決方案來說,這聽起來並不那么有趣,這就是為什么我建議改為查看為什么在不同分支上有不同文件的原因。


[1]如果您習慣以這種方式使用分支的工具,這似乎很奇怪。 但是,如果您查看由git定義的分支的一般情況,您將意識到有充分的理由為什么它不想做出使這“容易”的假設。

了解Git的工作原理!

默認情況下,每個Git分支都有一個祖先,但初始的master分支是所有其他分支的祖先。 因此,如果任何分支僅具有排他文件,而不是任何其他分支,那么您應該首先從該分支刪除所有文件,然后向其中添加一些排他文件。

因此,如果branch1branch2的祖先,而branch2沒有branch2的文件, branch1 branch2標記為不包含branch1文件。 因此,合並branch1branch2將刪除的文件branch1branch2 是的, 合並祖先除了更新祖先的更改外沒有其他作用

盡管一個人可以git checkout --orphan NewOrphan ,但不能將其與另一個具有不同歷史記錄的分支(祖先)合並。

因此,唯一的方法就是@EugenConstantinDinca評論中說。 或通過不刪除父分支的文件來重新考慮您要實現的目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM