Làm thế nào để rebase chi nhánh địa phương với chủ từ xa


934

Tôi có một dự án nhân bản từ một nhánh chính từ kho lưu trữ từ xa remote_repo. Tôi tạo một chi nhánh mới và tôi cam kết với chi nhánh đó. Các lập trình viên khác đẩy đến remote_reponhánh chính.

Bây giờ tôi cần khởi động lại nhánh RB của mình lên remote_repochủ.

làm như thế nào? Những lệnh nào để gõ vào một thiết bị đầu cuối?


14
Đối với tôi câu hỏi này không rõ ràng vì "với" có thể có nghĩa là nổi loạn theo một trong hai hướng. Nhìn vào các câu trả lời tôi thấy rằng mục đích là để đánh bật chi nhánh của bạn lên chủ nhân từ xa chứ không phải là cách khác. Tôi đề cập đến nó trong trường hợp ai đó làm theo câu trả lời dưới đây và nhận được điều ngược lại với những gì họ muốn.
Glenn Lawrence

8
@GlennLawrence Tôi nghĩ rằng tốt hơn là chỉnh sửa câu hỏi ban đầu hơn là thêm một nhận xét. Điều này cũng được khuyến khích bởi stackoverflow. Bên cạnh đó, việc khởi động lại chủ nhân vào RB có thể sẽ thất bại, vì RB phụ thuộc vào lịch sử của chủ nhân.
daniel kullmann

Câu trả lời:


1245

Trước tiên hãy tìm nạp chủ mới từ kho lưu trữ ngược dòng, sau đó khởi động lại nhánh công việc của bạn trên đó:

git fetch origin            # Updates origin/master
git rebase origin/master    # Rebases current branch onto origin/master

Cập nhật : Vui lòng xem câu trả lời của Paul Draper để có cách làm ngắn gọn hơn - các phiên bản Git gần đây cung cấp một cách đơn giản hơn để thực hiện tương đương với hai lệnh trên.


16
đây là câu trả lời duy nhất thực sự làm những gì đã được hỏi
kayaker243

5
@ kayaker243 Không, nó giống như câu trả lời của Paul Drapers nhưng ở dạng dài, tôi nghĩ vậy.
erik

7
@erik Lưu ý rằng Paul Draper đã viết câu trả lời của mình khoảng nửa năm sau bình luận của kayaker243 (và gần hai năm sau câu trả lời này).
Frerich Raabe

3
Tôi nhận được như sau: Your branch and 'origin/b1' have diverged, # and have 3 and 2 different commits each, respectively.Có vẻ như git pullcần một cái khác . Điều này đúng hay tôi đang thiếu một cái gì đó ở đây?
Dror

2
@RGC Không, git rebase mastersẽ không thực hiện cùng một công việc như lệnh thứ hai ( git rebase origin/master) masterorigin/mastercó thể chỉ ra các cam kết khác nhau (đặc biệt là khi lệnh đầu tiên là git fetch origin, có thể sửa đổi origin/master).
Frerich Raabe

816
git pull --rebase origin master
# where --rebase[=(false|true|merges|preserve|interactive)]

19
(Tương đương với câu trả lời của Frerich)
Paul Draper

12
không phải điều này hơi khác so với câu trả lời của Frerich, ở chỗ điều này sẽ cam kết thay đổi từ chủ gốc thành chủ địa phương, trong khi câu trả lời của Frerich khiến chủ địa phương không bị ảnh hưởng? (kéo so với tìm nạp)
Jimmy Huch

7
Không, trong câu trả lời của Frerich, rebase sửa đổi chủ địa phương. Một pull -rebase là điều tương tự như tìm nạp theo sau là một rebase
adhominem

9
FYI bạn có thể thực hiện các git pull --rebase=interactive origin master
cuộc nổi loạn

14
@adhominem - Tôi đã kiểm tra tài liệu git-pull và tôi không thể thấy bất cứ điều gì hỗ trợ cho tuyên bố rằng chủ địa phương đã được sửa đổi. Nếu tôi ở một nhánh có tên devvà chạy git pull --rebase origin master, chỉ có nhánh devsẽ được sửa đổi, không master. Các --rebasetài liệu cờ nói rằng nó cố gắng rebase the current branch on top of the upstream branch after fetchingvà không có gì về việc sửa đổi các chi nhánh theo dõi cục bộ.
Phục hồi Monica 2331977

227

Sau khi cam kết thay đổi cho chi nhánh của bạn, hãy kiểm tra mastervà kéo nó để nhận các thay đổi mới nhất từ ​​repo:

git checkout master
git pull origin master

Sau đó kiểm tra chi nhánh của bạn và phản hồi các thay đổi của bạn trên master :

git checkout RB
git rebase master

... hoặc hai lệnh cuối cùng trong một dòng:

git rebase master RB

Khi cố gắng đẩy trở lại origin/RB, rất có thể bạn sẽ gặp lỗi; nếu bạn là người duy nhất làm việcRB , bạn có thể buộc đẩy:

git push --force origin RB

... hoặc như sau nếu bạn có cấu hình git phù hợp:

git push -f

4
khi cố gắng đẩy trở lại nguồn gốc / RB, bạn có thể sẽ gặp lỗi. Nếu bạn là người duy nhất làm việc trên RB, bạn có thể git lực đẩy RB gốc. nguồn: stackoverflow.com/questions/8939977/ Mạnh
Joey Baruch

1
À .... tôi có chính xác cái này "RB" của tôi được khởi động lại một cách chính xác, nhưng tôi gặp phải những lỗi vô tận khi cố gắng đẩy nó sau cuộc nổi loạn. Ngoài việc thúc đẩy nguồn gốc RB - có cách nào "đẹp hơn" (không bắt buộc) để làm điều đó không? Tôi chỉ cố gắng để hiểu nhận thức về gits ở đây - và thất bại.
Motti Shneor

2
@MottiShneor Không, không có cách nào hay cả. Nếu người khác đẩy đến chi nhánh trong thời gian đó, những thay đổi của họ sẽ bị mất! Nếu bạn muốn trở nên tốt đẹp với lịch sử cam kết git, bạn nên hợp nhất chủ vào chi nhánh của mình, điều này an toàn (bạn có thể làm git pushmà không cần -f).
daniel kullmann

110

Lưu ý: Nếu bạn đã có kiến ​​thức rộng về rebase thì hãy sử dụng bên dưới một lớp lót để rebase nhanh. Giải pháp: Giả sử bạn ở trong nhánh làm việc của mình và bạn là người duy nhất làm việc trên nó.

git fetch && git rebase origin/master

Giải quyết mọi xung đột, kiểm tra mã của bạn, cam kết và đẩy các thay đổi mới đến chi nhánh từ xa.

                            ~:   For noobs   :~

Các bước sau đây có thể giúp bất kỳ ai mới git rebasevà muốn làm điều đó mà không gặp rắc rối

Bước 1: Giả sử rằng không có cam kết và thay đổi nào được thực hiện trên YourBranch tại thời điểm này. Chúng tôi đang truy cập YourBranch.

git checkout YourBranch
git pull --rebase

Chuyện gì đã xảy ra? Kéo tất cả các thay đổi được thực hiện bởi các nhà phát triển khác làm việc trên chi nhánh của bạn và khởi động lại các thay đổi của bạn trên đầu trang.

Bước 2: Giải quyết bất kỳ xung đột nào xảy ra.

Bước 3:

git checkout master
git pull --rebase

Chuyện gì đã xảy ra?Kéo tất cả các thay đổi mới nhất từ ​​chủ từ xa và khởi động lại chủ địa phương trên chủ từ xa. Tôi luôn giữ chủ từ xa sạch sẽ và sẵn sàng phát hành! Và, chỉ thích làm việc trên tổng thể hoặc chi nhánh địa phương. Tôi khuyên bạn nên làm điều này cho đến khi bạn nhận được sự thay đổi hoặc cam kết git. Lưu ý: Bước này không cần thiết nếu bạn không duy trì chủ cục bộ, thay vào đó bạn có thể thực hiện tìm nạp và khởi động lại chủ từ xa trực tiếp trên nhánh cục bộ. Như tôi đã đề cập trong bước duy nhất khi bắt đầu.

Bước 4: Giải quyết bất kỳ xung đột nào xảy ra.

Bước 5:

git checkout YourBranch
git rebase master

Chuyện gì đã xảy ra?Cuộc nổi loạn trên chủ xảy ra

Bước 6: Giải quyết mọi xung đột, nếu có xung đột. Sử dụng git rebase --continueđể tiếp tục rebase sau khi thêm các xung đột được giải quyết. Bất cứ lúc nào bạn có thể sử dụnggit rebase --abort để hủy bỏ cuộc nổi loạn.

Bước 7:

git push --force-with-lease 

Chuyện gì đã xảy ra? Đẩy các thay đổi vào YourBranch từ xa của bạn.--force-with-leasesẽ đảm bảo liệu có bất kỳ thay đổi nào khác cho YourBranch từ các nhà phát triển khác trong khi bạn khởi động lại hay không. Điều này là siêu hữu ích hơn là lực đẩy. Trong trường hợp có bất kỳ thay đổi nào thì hãy tìm nạp chúng để cập nhật YourBranch cục bộ của bạn trước khi đẩy các thay đổi.

Tại sao tôi cần phải thay đổi? Để viết lại thông điệp cam kết trong YourBranch từ xa sau khi rebase thích hợp hoặc Nếu có bất kỳ xung đột nào được giải quyết? Sau đó, bạn cần đẩy các thay đổi bạn đã giải quyết trong repo cục bộ sang repo từ xa của YourBranch

Yahoo ...! Bạn đã thành công với việc nổi loạn.

Bạn cũng có thể đang xem xét:

git checkout master
git merge YourBranch

Khi nào và tại sao? Hợp nhất chi nhánh của bạn thành chủ nếu được thực hiện với các thay đổi của bạn và các nhà đồng phát triển khác. Điều này làm cho YourBranch cập nhật với chủ khi bạn muốn làm việc trên cùng một chi nhánh sau này.

                            ~:   (๑ơ ₃ ơ)♥ rebase   :~

Cái này dùng để làm gì: "Kéo tất cả những thay đổi mới nhất từ ​​chủ và nổi loạn chủ trên chủ mới nhất.". Rebase master trên master? Không phải bạn chỉ cần kéo chủ mới nhất?
John Little

@JohnLittle Cảm ơn bạn đã chỉ ra. Ý tôi là Pulls latest changes from remote master to local master. I always prefer keeping remote master clean and release ready always!. Tôi sẽ cập nhật mô tả của tôi.
bh4r4

21

Bước 1:

git fetch origin

Bước 2:

git rebase origin/master

Bước 3: (Khắc phục nếu có xung đột)

git add .

Bước 4:

git rebase --continue

Bước 5:

git push --force

5
Không có lời giải thích nào để bắt đầu chi nhánh. Không phải là một câu trả lời tốt.
Karl Morrison

12

1.Cập nhật trước tiên ...

git checkout [master branch]
git pull [master branch]

2.Bây giờ rebase nhánh nguồn với nhánh chính

git checkout [source branch]
git rebase [master branch]
git pull [source branch] (remote/source branch)
git push [source branch]

NẾU nguồn nhánh chưa tồn tại trên remote thì làm:

git push -u origin [source branch]

"et voila ..."


Tôi thích bản chất từng bước của câu trả lời này. Nó giúp phá vỡ những gì chính xác đang xảy ra.
Dave Liu

6

git fetch origin master:master kéo phiên bản mới nhất của master mà không cần kiểm tra.

Vì vậy, tất cả những gì bạn cần là:

git fetch origin master:master && git rebase master 👌


Không git fetchcập nhật chủ mà không cần phải kiểm tra quá? Ngoại trừ việc git fetchkhông git mergecập nhật đúng không? Vì vậy, nếu chúng tôi kiểm tra masternó sẽ không có bản cập nhật mới nhất. Vì vậy, nó không phải là ngắn hơn để làm trong khi trên nhánh tính năng, git fetchsau đó git rebase origin/master? Chúng ta không thể làm điều đó git rebase masterbởi vì điều đó sẽ cố gắng nổi loạn mastertrong không gian làm việc, chúng ta cần origin/masterphải đi từ nơi không được hòa nhập nhưng ngồi ở địa phương.
Noitidart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.