Chi nhánh của bạn đi trước 'origin / master' bởi 3 lần cam kết


354

Tôi nhận được sau đây khi chạy git status

Your branch is ahead of 'origin/master' by 3 commits.

Tôi đã đọc trên một số bài đăng khác cách khắc phục sự cố này git pull --rebasenhưng chính xác thì rebase là gì, tôi sẽ mất dữ liệu hay đây là cách đơn giản để đồng bộ hóa với chủ?


19
Tôi không nghĩ đây là một bản sao ... Câu hỏi này là hỏi nó có nghĩa gì, trong khi câu hỏi còn lại là hỏi làm thế nào để loại bỏ các thay đổi.
tây

11
Làm thế nào điều này được đánh dấu là một bản sao của rất nhiều người? Câu hỏi rõ ràng cho thấy người đó không muốn mất đi những thay đổi của họ. Họ đã thực hiện các thay đổi và bị nhầm lẫn bởi tin nhắn. Câu hỏi được gọi là trùng lặp sẽ khiến người đó mất đi những thay đổi của họ.
Derek Greer

4
Tôi phải nói rằng câu hỏi liên quan đến ở trên không thực sự là một bản sao của câu hỏi này ...
Dave Kanter

15
@DerekGreer: làm thế nào điều này được đánh dấu là một bản sao? Bởi vì hầu hết những người đánh dấu các câu hỏi là trùng lặp không thực sự đọc và hiểu câu hỏi. Nếu có những điểm tương đồng bề ngoài, họ sẽ đi đến kết luận rằng hai người giống hệt nhau và sẽ tùy thuộc vào OP hoặc những người khác sẵn sàng dành thời gian để lặp lại cẩn thận những gì đáng lẽ phải rõ ràng ngay từ đầu, nếu thợ săn dupe đã thực sự quan tâm để chú ý.
iconoclast

6
^ ^ thực tế là giết chết SO, IMO.
Cổ phiếu Geek

Câu trả lời:


767

Bạn nhận được thông báo đó vì bạn đã thực hiện các thay đổi trong chủ địa phương và bạn đã không đẩy chúng ra từ xa. Bạn có một số cách để "giải quyết" nó và nó thường phụ thuộc vào cách thức công việc của bạn trông như thế nào:

  • Trong một quy trình tốt, bản sao chính của bạn phải là bản sao tốt trong khi bản sao chính của bạn chỉ là bản sao của bản gốc từ xa. Sử dụng quy trình công việc này, bạn sẽ không bao giờ nhận được thông báo này nữa.
  • Nếu bạn làm việc theo cách khác và các thay đổi cục bộ của bạn sẽ được đẩy thì chỉ cần git push origingiả sử nguồn gốc là từ xa của bạn
  • Nếu thay đổi cục bộ của bạn là xấu thì chỉ cần xóa chúng hoặc đặt lại chủ cục bộ của bạn về trạng thái từ xa git reset --hard origin/master

82
git reset - nguồn gốc / chủ chính xác là những gì tôi đang tìm kiếm. Cảm ơn.
FluxEngine

4
@iberbeu bạn đã giải quyết ngày của tôi ... git reset - nguồn gốc / chủ là thứ tôi đang tìm kiếm. + 1ed
Ravi

75
Đồng thời fwiw git diff master origin/master(tức là git diff local remote) để xem những thay đổi bạn sẽ xóa
Shanimal

1
Tôi có local / master trên nguồn gốc / chi nhánh từ xa nên sử dụng git push origin master:branchcái nào được trả về Everything up-to-date, sau đó thông báo đi trước bởi x cam kết đã biến mất.
fyrye

2
Người cuối cùng đã cho tôi những gì tôi cần ở đó!
RyanG

38

Không có gì để sửa chữa. Bạn chỉ cần thực hiện 3 lần xác nhận và chưa chuyển chúng đến chi nhánh từ xa. Có một số tùy chọn, tùy thuộc vào những gì bạn muốn làm:

  • git push: di chuyển các thay đổi của bạn sang điều khiển từ xa (điều này có thể bị từ chối nếu đã có các thay đổi khác trên điều khiển từ xa)
  • không làm gì và tiếp tục mã hóa, đồng bộ hóa vào một ngày khác
  • git pull: nhận các thay đổi (nếu có) từ xa và hợp nhất chúng vào các thay đổi của bạn
  • git pull --rebase: như trên, nhưng cố gắng làm lại các cam kết của bạn trên đầu các thay đổi từ xa

Bạn đang ở trong một tình huống cổ điển (mặc dù thông thường bạn sẽ không cam kết nhiều về chủ trong hầu hết các quy trình công việc). Đây là những gì tôi thường làm: Xem lại những thay đổi của tôi. Có thể làm một git rebase --interactivesố mỹ phẩm trên chúng, bỏ những thứ hút, sắp xếp lại chúng để làm cho chúng hợp lý hơn. Bây giờ di chuyển chúng đến điều khiển từ xa với git push. Nếu điều này bị từ chối vì chi nhánh địa phương của tôi không cập nhật: git pull --rebaseđể làm lại công việc của tôi trên đầu những thay đổi gần đây nhất và git pushmột lần nữa.


Tôi đã sử dụng git pull --rebase, nhưng bây giờ nó nói rằng tôi đi trước một cam kết
FluxEngine

Vì vậy, tôi đã thực hiện các thay đổi, được đẩy lên thành chủ, và sau đó nhóm trưởng của chúng tôi sáp nhập thành chủ. Vì vậy, những thay đổi ở đó tôi chỉ cần được đồng bộ hóa với chủ hiện tại.
FluxEngine

@MartyMcFly Thật khó để thấy những gì đang diễn ra ở đây. Bạn nói bạn đã đẩy? Vậy tại sao bạn vẫn cam kết không thành thạo? Bạn có ý nghĩa your team lead merged to mastergì? Không phải bạn nói bạn đã đẩy lên thành thạo rồi sao? Cam kết bổ sung chứa gì? Hãy thử git diff origin/masterxem chi nhánh địa phương của bạn khác với điều khiển từ xa như thế nào.
pmr

1
cảm ơn vì sự giúp đỡ, xin lỗi nếu tôi làm một công việc tồi tệ để giải thích tình hình. Nhưng những gì tôi đang tìm kiếm là git reset - nguồn gốc / chủ. Nhưng câu trả lời của bạn rất hữu ích +1.
FluxEngine

Tôi dường như bị mắc kẹt giữa một tảng đá và một nơi khó khăn, tôi đã cố gắng thực hiện các thay đổi, sau đó git nói: bạn đang ở phía trước 11 lần cam kết. Tôi không được phép cập nhật kho lưu trữ từ xa, vì vậy việc đẩy là không thể. "Git pull" nói: Đã cập nhật. Vì vậy, tôi đã thử đề xuất thứ ba của bạn, nhưng sau đó git nói: không thể kéo theo rebase: Bạn có những thay đổi chưa được thực hiện. xin vui lòng cam kết hoặc stash chúng. Duh, đó là cách tôi đến đây ngay từ đầu :-(
Sander de Jong

36

Sử dụng 4 lệnh đơn giản này

Bước 1 :git checkout <branch_name>

Điều này là rõ ràng để đi vào chi nhánh đó.

Bước 2 :git pull -s recursive -X theirs

Thực hiện các thay đổi chi nhánh từ xa và thay thế bằng các thay đổi của chúng nếu xung đột phát sinh. Ở đây nếu bạn làm, git statusbạn sẽ nhận được một cái gì đó như thế này, chi nhánh của bạn đi trước 'origin / master' bằng 3 lần xác nhận.

Bước 3 :git reset --hard origin/<branch_name>

Bước 4 :git fetch

Khó thiết lập lại chi nhánh của bạn.

Thưởng thức.


17

Đã giải quyết vấn đề này sau khi tôi hợp nhất một yêu cầu kéo trên Bitbucket.

Phải làm

git fetch

và đó là nó.


2
Tôi đã làm việc với một repo từ một gói và có thể loại bỏ tin nhắn bằng cách áp dụng "git fetch" cho một gói hiện tại. tnx!
Martin Meeser

Khi kiểm tra chỉ đọc trạng thái git của tôi cho thấy tôi có 2 lần xác nhận trước, nhật ký trông như bình thường - tất cả các cam kết trong nguồn gốc. Tôi đã thực hiện một cú kéo git và được 5 lần cam kết trước..WTF ???? Chỉ cần tìm nạp để làm mới các chỉ mục địa phương ... tất cả đều tốt :)
Chris Rutledge

12

Thông thường nếu tôi phải kiểm tra các cam kết khác với chủ tôi thực hiện:

git rebase -i origin/master

Bằng cách này, tôi có thể thấy các cam kết và quyết định bỏ nó hoặc chọn ...


Câu trả lời thấp hèn này ở đây là những gì tôi cần làm. Tôi không thể tìm ra cách tìm ra sự khác biệt và tất cả các git diff ...phép thuật khác nhau của tôi sẽ không hoạt động. Khi tôi làm điều này, nó đã cho tôi noopnhư là một cam kết duy nhất và khi tôi chấp nhận nó, bây giờ chi nhánh của tôi không đồng bộ với nguồn gốc / chủ. Vì vậy, nó xuất hiện các cam kết khác với nguồn gốc / chủ có hiệu lực không có gì.
philo vivero

11

Thông báo này gitcó nghĩa là bạn đã thực hiện ba lần xác nhận trong repo cục bộ của mình và chưa xuất bản chúng lên masterkho lưu trữ. Lệnh để chạy cho đó là git push {local branch name} {remote branch name}.

Lệnh git pull(và git pull --rebase) dành cho tình huống khác khi có cam kết trên repo từ xa mà bạn không có trong repo cục bộ của mình. Các --rebasephương tiện tùy chọn đó gitsẽ di chuyển địa phương cam kết sang một bên, đồng bộ hóa với repo từ xa, và sau đó cố gắng áp dụng ba của bạn cam kết từ trạng thái mới. Nó có thể thất bại nếu có xung đột, nhưng sau đó bạn sẽ được nhắc giải quyết chúng. Bạn cũng có thể hủy bỏ rebasenếu bạn không biết cách giải quyết xung đột bằng cách sử dụng git rebase --abortvà bạn sẽ quay lại trạng thái trước khi chạy git pull --rebase.


7

Nếu git của bạn nói rằng bạn cam kết trước thì chỉ cần Đầu tiên,

nguồn gốc git đẩy

Để chắc chắn rằng bạn đã đẩy tất cả công việc mới nhất của bạn vào repo

Sau đó,

thiết lập lại git - nguồn gốc / chủ

Để thiết lập lại và phù hợp với repo


4

Điều này đã xảy ra với tôi một lần sau khi tôi hợp nhất một yêu cầu kéo trên Bitbucket.

Tôi chỉ phải làm:

git fetch

Vấn đề của tôi đã được giải quyết. Tôi hi vọng cái này giúp được!!!


0
$ git fetch

  - remote: Enumerating objects: 3, done.
  - remote: Counting objects: 100% (3/3), done.
  - remote: Compressing objects: 100% (3/3), done.
  - remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0


$ git pull 

   - Already up to date!
   - Merge made by the 'recursive' strategy.

cuối cùng:

$ git push origin
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.