Cập nhật đã bị từ chối vì tiền boa của chi nhánh hiện tại của bạn đứng sau


154

Tôi mới sử dụng Git, vì vậy hãy thoải mái đối xử với tôi như một người mới.

Quy trình làm việc của chúng tôi là như vậy. Chúng tôi có một chi nhánh devmà tôi có thể tiếp cận origin/dev. Khi chúng tôi thay đổi, chúng tôi tạo một nhánh tắt dev:

kiểm tra git -b FixForBug gốc / dev

Bây giờ tôi có một chi nhánh được gọi FixForBuglà theo dõi (tôi nghĩ đó là từ đúng) origin/dev. Vì vậy, nếu tôi làm điều git pullđó sẽ mang lại những thay đổi mới từ origin/devđó là tuyệt vời. Bây giờ, khi tôi đã hoàn thành việc sửa lỗi của mình, tôi đẩy đến một nhánh từ xa được gọi là điều tương tự.

Đầu tiên tôi kéo xuống bất kỳ thay đổi nào origin/devvà thực hiện rebase:

git kéo --rebase

Sau đó, tôi đẩy các thay đổi đến một nhánh từ xa cùng tên:

nguồn gốc git FixForBug

Bây giờ, có một nhánh trên máy chủ từ xa và tôi có thể tạo một yêu cầu kéo để thay đổi đó được phê duyệt và sáp nhập trở lại vào nhánh dev. Tôi không bao giờ đẩy bất cứ điều gì cho origin/devbản thân mình. Tôi đoán đây là quy trình công việc khá phổ biến.

Lần đầu tiên tôi làm git push, nó hoạt động tốt và tạo ra nhánh từ xa. Tuy nhiên, nếu tôi đẩy lần thứ hai (giả sử trong quá trình xem lại mã, ai đó sẽ chỉ ra một vấn đề), tôi gặp phải lỗi sau:

lỗi: không thể đẩy một số giới thiệu đến ' https://github.limeade.info/Limeade/product.git ': Các cập nhật đã bị từ chối vì mẹo của chi nhánh hiện tại của bạn nằm sau gợi ý: đối tác từ xa của nó. Tích hợp các thay đổi từ xa (ví dụ: gợi ý: 'git pull ...') trước khi đẩy lại. gợi ý: Xem phần 'Lưu ý về chuyển tiếp nhanh' trong 'git đẩy - trợ giúp' để biết chi tiết.

Tuy nhiên, nếu tôi thực hiện git statusthì nó nói rằng tôi đi trước origin/dev1 cam kết (điều này có ý nghĩa) và nếu tôi làm theo gợi ý và chạy git pull, nó nói mọi thứ đã được cập nhật. Tôi nghĩ điều này là do tôi đang đẩy sang một chi nhánh khác với chi nhánh thượng nguồn của mình. Tôi có thể khắc phục sự cố này bằng cách chạy:

git push -f origin FixForBug

Trong trường hợp đó, nó sẽ đẩy các thay đổi đến nhánh từ xa, nói (cập nhật bắt buộc) và mọi thứ dường như đều tốt trên nhánh từ xa.

Những câu hỏi của tôi:

Tại sao được -fyêu cầu trong kịch bản này? Thông thường khi bạn đang ép buộc một cái gì đó, đó là vì bạn đã làm sai điều gì đó hoặc ít nhất là chống lại thực hành tiêu chuẩn. Tôi có ổn không khi làm điều này, hay nó sẽ làm rối tung một cái gì đó trong nhánh từ xa hoặc tạo rắc rối cho bất cứ ai cuối cùng phải hợp nhất công cụ của tôi vào dev?


2
Có vẻ như thông báo bạn đang nhận được nói rằng chi nhánh từ xa FixForBug đi trước chi nhánh FixForBug tại địa phương của bạn. Bạn nên kéo xuống các thay đổi từ nhánh từ xa đó và hợp nhất chúng vào nhánh cục bộ của bạn trước khi đẩy.
mhatch

4
@mhatch - Vì vậy, về cơ bản chạy git pull origin FixForBugtrước khi tôi đẩy đến đó? Được rồi, cái đó có lý. Hãy thêm vào như một câu trả lời!
Mike Christensen

Câu trả lời:


199

Điều -f này thực sự cần thiết vì sự nổi loạn. Bất cứ khi nào bạn thực hiện một cuộc nổi loạn, bạn sẽ cần phải thực hiện một cú đẩy mạnh mẽ vì nhánh từ xa không thể được chuyển tiếp nhanh đến cam kết của bạn. Bạn luôn muốn đảm bảo rằng bạn thực hiện thao tác kéo trước khi đẩy, nhưng nếu bạn không muốn buộc đẩy thành chủ hoặc dev cho vấn đề đó, bạn có thể tạo một nhánh mới để đẩy tới và sau đó hợp nhất hoặc thực hiện PR .


2
Cảm ơn câu trả lời rất hữu ích này! :)
AIM_BLB

1
Bạn có thể làm rõ quan điểm "Bạn luôn muốn đảm bảo rằng bạn thực hiện một động tác kéo trước khi đẩy"? Rõ ràng là tại sao "đẩy -f" sau khi rebase của chi nhánh địa phương là bắt buộc. Trong trường hợp này, sẽ không hoàn tác cuộc nổi loạn của địa phương bằng cách thực hiện thao tác kéo điều khiển từ xa trước khi đẩy?
haripkannan

51

Để đảm bảo FixForBug chi nhánh địa phương của bạn không đi trước kéo từ xa FixForBug và hợp nhất các thay đổi trước khi đẩy.

git pull origin FixForBug
git push origin FixForBug

2
OP tuyên bố họ đã thực hiện một động tác kéo và cố gắng đẩy. Câu trả lời của bạn không áp dụng cho câu hỏi của OP.
Patrick

1
Luôn luôn tốt hơn để tránh một lực đẩy. Cảm ơn đã chia sẻ điều này!
Ann Kilzer

16

Nếu bạn muốn tránh phải sử dụng -f, thì bạn có thể sử dụng chỉ

git pull

thay vì

git pull --rebase

Non-rebase sẽ lấy các thay đổi từ origin/devhợp nhất chúng vào FixForBugnhánh của bạn . Sau đó, bạn sẽ có thể chạy

git push origin FixForBug

mà không sử dụng -f.


3
Rebase là một phần của dòng chảy công việc của chúng tôi ở đây. Tôi sẽ bị mắng nếu tôi không làm điều đó.
Mike Christensen

1
@MikeChristensen: Được rồi, vậy thì làm theo thủ tục tài liệu của khóa học. Từ những gì bạn mô tả, bạn sẽ cần sử dụng -fvì bạn đang thay thế (các) cam kết trên kho lưu trữ ngược dòng bằng các kho lưu trữ khác nhau có lịch sử (bị loại bỏ) khác nhau. Nếu bạn đã sử dụng một sản phẩm như Gerrit thì nó hỗ trợ loại công việc đánh giá lại mã này mà không phải sử dụng -fkhi đẩy. Chúng tôi sử dụng Gerrit tại nơi làm việc theo cách này và nó hoạt động rất tốt.
Greg Hewgill

12

the tip of your current branch is behind its remote counterpartcó nghĩa là đã có những thay đổi trên nhánh từ xa mà bạn không có tại địa phương. và git cho bạn biết nhập các thay đổi mới từ REMOTEvà hợp nhất nó với mã của bạn và sau pushđó chuyển sang điều khiển từ xa.

Bạn có thể sử dụng lệnh này để buộc thay đổi máy chủ với repo cục bộ ().

git push -f origin master

với -fthẻ bạn sẽ ghi đè Remote Brach codebằng mã của bạn.


6

Lệnh tôi đã sử dụng với Azure DevOps khi tôi gặp thông báo "các cập nhật đã bị từ chối vì phần đầu của chi nhánh hiện tại của bạn nằm phía sau" là / là lệnh này:

git kéo nguồn gốc

(hoặc có thể bắt đầu với một thư mục mới và thực hiện Sao chép) ..

Câu trả lời này không giải quyết câu hỏi được đặt ra, cụ thể, Keif đã trả lời câu hỏi trên, nhưng nó trả lời văn bản tiêu đề / tiêu đề của câu hỏi và đây sẽ là một câu hỏi phổ biến cho người dùng Azure DevOps.

Tôi lưu ý nhận xét: "Bạn luôn muốn đảm bảo rằng bạn thực hiện thao tác kéo trước khi đẩy" trong câu trả lời từ Keif ở trên!

Tôi cũng đã sử dụng công cụ Git Gui ngoài công cụ dòng lệnh Git.

(Tôi không chắc chắn cách thực hiện tương đương với lệnh dòng lệnh "git pull origin master" trong Git Gui để tôi quay lại dòng lệnh để thực hiện việc này).

Một sơ đồ hiển thị các lệnh git khác nhau cho các hành động khác nhau mà bạn có thể muốn thực hiện là cái này:

nhập mô tả hình ảnh ở đây


4

Nó vừa mới xảy ra với tôi.

  • Tôi đã thực hiện một yêu cầu kéo đến chủ của chúng tôi ngày hôm qua.
  • Đồng nghiệp của tôi đã xem xét nó ngày hôm nay và thấy rằng nó không đồng bộ với chi nhánh chính của chúng tôi, vì vậy với ý định giúp tôi, anh ấy đã sáp nhập chủ vào chi nhánh của tôi.
  • Tôi không biết anh ấy đã làm điều đó.
  • Sau đó, tôi sáp nhập chủ địa phương, cố gắng đẩy nó, nhưng nó đã thất bại. Tại sao? Bởi vì đồng nghiệp của tôi hợp nhất với chủ đã tạo ra một cam kết bổ sung mà tôi không có tại địa phương !

Giải pháp: Kéo chi nhánh của tôi xuống để tôi có thêm cam kết. Sau đó đẩy nó trở lại chi nhánh từ xa của tôi.

nghĩa đen những gì tôi đã làm trên chi nhánh của tôi là:

git pull
git push

3

Đây là cách tôi giải quyết vấn đề của mình

Giả sử chi nhánh ngược dòng là nhánh mà bạn rẽ nhánh và nguồn gốc là repo của bạn và bạn muốn gửi MR / PR đến nhánh ngược dòng.

Bạn đã có khoảng 4 lần cam kết và bạn sẽ nhận được Updates were rejected because the tip of your current branch is behind.

Đây là những gì tôi đã làm

Đầu tiên, squash tất cả 4 cam kết của bạn

git rebase -i HEAD~4

Bạn sẽ nhận được một danh sách các cam kết với pick văn bản trên chúng. (đã mở trong một trình soạn thảo)

thí dụ

pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
pick c011a77 commit 4

đến

pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
squash c011a77 commit 4

Sau đó, bạn có thể lưu cam kết kết hợp của mình

Kế tiếp

Bạn sẽ cần phải thực hiện cam kết của mình

Đây là cách

git reset --soft HEAD~1
git stash

bây giờ nổi loạn với chi nhánh thượng nguồn của bạn

git fetch upstream beta && git rebase upstream/beta

Bây giờ hãy bật cam kết của bạn

git stash pop

cam kết những thay đổi này và đẩy chúng

git add -A
git commit -m "[foo] - foobar commit"
git push origin fix/#123 -f

2

Nó phải là vì cam kết đi trước sự thúc đẩy hiện tại của bạn.

1) git pull origin "tên của chi nhánh bạn muốn đẩy"

2) git rebase

nếu git rebase thành công thì tốt. Mặt khác, bạn đã giải quyết tất cả các xung đột hợp nhất cục bộ và giữ cho nó tiếp tục cho đến khi rebase với remote thành công.

3) git rebase - tiếp tục


0

Tôi gặp vấn đề này khi cố gắng đẩy sau khi rebase thông qua Visual Studio Code, vấn đề của tôi đã được giải quyết bằng cách sao chép lệnh từ cửa sổ đầu ra git và thực thi nó từ cửa sổ terminal trong Visual Studio Code.

Trong trường hợp của tôi, lệnh là một cái gì đó như:

git push origin NameOfMyBranch:NameOfMyBranch

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.