TL; DR;
Özetlemek gerekirse ( Benubird yorum olarak ), ne zaman:
git checkout A
git rebase B # rebase A on top of B
local
olduğu B
(rebase üzerine ),
remote
dır-dir A
Ve:
git checkout A
git merge B # merge B into A
local
olduğu A
(birleştirme içine )
remote
dır-dir B
Bir rebase anahtarları ours
(rebase başlamadan önceki geçerli dal) ve theirs
(üstünde yeniden birleştirmek istediğiniz dal).
kutschkem , bir GUI birleştirme aracı bağlamında şunları belirtir :
- yerel referanslar kısmen yeniden temel alınan taahhütler : "
ours
" (yukarı akış şubesi)
- remote, gelen değişiklikleri ifade eder : "
theirs
" - yeniden tabandan önceki geçerli şube.
Bu cevabın son bölümündeki çizimlere bakınız.
Rebase olduğunda inversiyon
Karışıklık, bir yeniden tabanın ters çevrilmesi ours
ve theirs
sırasında ters düşme ile ilgili olabilir .
(ilgili alıntılar)
git rebase
man sayfası :
Bir rebase birleşmesinin, <upstream>
dalın üstündeki çalışma dalından her bir taahhüdü tekrarlayarak çalıştığını unutmayın .
Bu nedenle, bir birleşme çakışması olduğunda:
- '
ours
' olarak bildirilen taraf , şu ana kadarki yeniden temel alan seridir <upstream>
,
- ve '
theirs
' çalışma koludur. Başka bir deyişle, kenarlar değiştirilir.
Gösterilen ters çevirme
Birleşmede
x--x--x--x--x(*) <- current branch B ('*'=HEAD)
\
\
\--y--y--y <- other branch to merge
, şu andaki 'B' dalını değiştirmiyoruz, bu yüzden elimizde hala üzerinde çalıştığımız şey var (ve başka bir daldan birleşiyoruz)
x--x--x--x--x---------o(*) MERGE, still on branch B
\ ^ /
\ ours /
\ /
--y--y--y--/
^
their
Bir rebase üzerinde:
Ancak bir rebase'de taraf değiştiriyoruz çünkü bir rebase'in yaptığı ilk şey yukarı akış şubesini kontrol etmektir! (geçerli taahhütleri tekrar oynatmak için)
x--x--x--x--x(*) <- current branch B
\
\
\--y--y--y <- upstream branch
A git rebase upstream
ilk HEAD
olarak B'yi yukarı akış koluna değiştirir HEAD
(bu nedenle önceki "mevcut" çalışma koluna kıyasla "bizim" ve "onların" anahtarı).
x--x--x--x--x <- former "current" branch, new "theirs"
\
\
\--y--y--y(*) <- upstream branch with B reset on it,
new "ours", to replay x's on it
ve daha sonra rebase yeni 'bizim' şubemizdeki 'taahhütlerini' tekrar edecek:
x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
\
\
\--y--y--y--x'--x'--x'(*) <- branch B with HEAD updated ("ours")
^
|
upstream branch
Not: "yukarı akış" kavramı , verilerin okunduğu veya yeni verilerin eklendiği / oluşturulduğu referans veri kümesidir (tüm bir repo veya burada olduğu gibi yerel bir şube olabilen bir dal).
' local
' ve ' remote
' vs. ' mine
' ve ' theirs
'
Pandawood ekler yorumlarla :
Benim için hala "yerel" olan ve "uzak" olan soru hala devam ediyor ("bizim" ve "onların" terimleri git'e basarken kullanılmadığından, bunlara atıfta bulunarak bir cevap daha kafa karıştırıcı görünüyor) .
GUI git mergetool
kutschkem ekler ve haklı olarak:
Çatışmaları çözerken git şöyle bir şey söyleyecektir:
local: modified file and remote: modified file.
Sorunun bu noktada yerel ve uzak tanımlamayı amaçladığından eminim. Bu noktada, bana göre deneyimlerimden:
- yerel referanslar kısmen yeniden temel alınan taahhütler : "
ours
" (yukarı akış şubesi)
- remote, gelen değişiklikleri ifade eder : "
theirs
" - yeniden tabandan önceki geçerli şube.
git mergetool
gerçekten de 'yerel' ve 'uzak' ifadelerinden bahsediyor :
Merging:
f.txt
Normal merge conflict for 'f.txt':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (kdiff3):
Örneğin, KDiff3 olur şöyle birleştirme çözünürlüğünü görüntülemek :
Ve meld bunu da gösterecekti :
İçin aynı VimDiff , görüntüler :
Vimdiff'i git mergetool -t gvimdiff ile bir birleştirme aracı olarak çağır. Git'in son sürümleri Vimdiff'i aşağıdaki pencere düzeniyle çağırır:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
LOCAL
:
Geçerli daldaki dosyanın içeriğini içeren geçici bir dosya.
BASE
:
Birleştirme için ortak tabanı içeren geçici bir dosya.
REMOTE
:
Birleştirilecek dosyanın içeriğini içeren geçici bir dosya.
MERGED
:
Çakışma işaretlerini içeren dosya.
Git mümkün olduğunca otomatik çatışma çözümü olarak yürüttü ve bu dosyanın devlet her ikisinin bir kombinasyonudur LOCAL
ve REMOTE
Git kendini çözmek olamayacağını şey çevreleyen çatışma işaretleri ile. Bu dosyaya kararın sonucunu yazmalısınız.
mergetool