Điều đó có vẻ phù hợp với những gì rebase làm.
git svn rebase
sẽ tìm nạp các bản sửa đổi từ SVN cha của HEAD hiện tại và khôi phục lại hoạt động hiện tại (không cam kết với SVN) chống lại nó.
git rebase
có đề cập đến:
Lưu ý rằng hợp nhất rebase hoạt động bằng cách phát lại từng cam kết từ nhánh làm việc trên đầu <upstream>
nhánh.
Do đó, khi xung đột hợp nhất xảy ra:
- phía được báo cáo là của chúng tôi là loạt phim được phục hồi cho đến nay, bắt đầu bằng
<upstream>
,
- và của họ là nhánh làm việc .
Nói cách khác, các bên được hoán đổi .
git rebase phát lại từng cam kết từ nhánh đang làm việc trên đầu <upstream>
nhánh.
Nếu bạn dung hòa cả hai định nghĩa:
- các cam kết đến từ SVN là những cam kết mà trên đó các cam kết Git cục bộ được phát lại. Chúng là một phần của "loạt phim được giảm giá cho đến nay" và được tham chiếu là "của chúng tôi" (trong trường hợp của bạn là
test.txt
tệp có bar
nội dung)
- nhánh làm việc (chứa Git cam kết không xác định với SVN, trong trường hợp của bạn,
test.txt
tệp có baz
nội dung) là "của họ" và mỗi cam kết Git cục bộ đó đang được phát lại.
Nói cách khác, SVN hay không:
- các "
<upstream>
" chi nhánh (trên đầu trang của bất cứ điều gì mà được tái hiện lại, và đó là một phần của cam kết cho đến nay rebased ") là" chúng ta ".
- những gì đang được phát lại (nhánh làm việc) là " của họ ".
Tốt mũi mnemonic bởi CommaToast :
bất cứ điều gì HEAD trỏ tới là "của chúng tôi"
(và điều đầu tiên a git rebase upstream
thực hiện là kiểm tra upstream
nhánh trên cùng mà bạn muốn rebase: HEAD đề cập đến upstream
- ours
ngay bây giờ.)
Sự nhầm lẫn có thể đến từ vai trò của nhánh làm việc trong một tác phẩm cổ điển git merge
.
Khi bạn đang hợp nhất:
- "chi nhánh làm việc" là chi nhánh chứa những gì được "hợp nhất cho đến nay" và được coi là "của chúng tôi",
- trong khi cam kết khác đại diện cho những gì đang được - không được phát lại nhưng - hợp nhất trên đầu nhánh làm việc và được coi là "của chúng".
Như git rebase
trang người đàn ông đề cập, hợp nhất trong một rebase có nghĩa là các bên được hoán đổi.
Một cách khác để nói điều tương tự là xem xét rằng:
- những gì chúng tôi có trên chi nhánh đã thanh toán là 'của chúng tôi ',
- những gì chúng tôi đã có (và đang được hợp nhất hoặc phát lại) là ' của họ '.
Khi hợp nhất :
x--x--x--x--x(*) <- current branch B ('*'=HEAD)
\
\
\--y--y--y <- other branch to merge
, chúng tôi không thay đổi nhánh hiện tại 'B', vì vậy những gì chúng tôi có vẫn là những gì chúng tôi đang làm việc (và chúng tôi hợp nhất từ một nhánh khác)
x--x--x--x--x---------o(*) MERGE, still on branch B
\ ^ /
\ ours /
\ /
--y--y--y--/
^
their
Nhưng trên rebase , chúng tôi đổi bên vì điều đầu tiên mà rebase làm là kiểm tra nhánh ngược dòng! (để phát lại các cam kết hiện tại trên đó)
x--x--x--x--x(*) <- current branch B
\
\
\--y--y--y <- upstream branch
git rebase upstream
Đầu tiên A sẽ thay đổi HEAD
B thành nhánh ngược dòng HEAD
(do đó chuyển đổi của 'của chúng ta' và 'của họ' so với nhánh làm việc "hiện tại" trước đó.)
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
và sau đó rebase sẽ phát lại các cam kết 'của họ' trên nhánh B mới của 'chúng tôi':
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
Bước bổ sung duy nhất git svn rebase
là "tìm nạp" svn được thực hiện đầu tiên trên nhánh từ xa Git đại diện cho các cam kết của SVN.
Ban đầu bạn có:
x--x--x--x--x(*) <- current branch B, "ours" for now.
\
\
\--y--y--y <- SVN tracking branch, "theirs for now"
, trước tiên bạn cập nhật nhánh theo dõi SVN với các cam kết mới đến từ SVN
x--x--x--x--x(*) <- current branch B, still "ours", not for long
\
\
\--y--y--y--y'--y' <- SVN tracking branch updated
, sau đó bạn chuyển nhánh hiện tại sang phía SVN (trở thành "của chúng tôi")
x--x--x--x--x <- for "B", now "their" during the rebase
\
\
\--y--y--y--y'--y'(*) <- SVN tracking branch updated, and branch B:
now "ours" (this is "what we now have")
, trước khi phát lại các cam kết mà bạn đã thực hiện (nhưng bây giờ là "của họ" trong quá trình rebase đó)
x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
\
\
\--y--y--y--y'--y'--x'--x'--x'(*) <- branch B with HEAD updated ("ours")
^
|
upstream SVN tracking branch