git: Chi nhánh và 'origin / master' của bạn đã khác nhau - làm thế nào để loại bỏ các cam kết cục bộ?


79

Tôi có tin nhắn sau trong git:

# Your branch and 'origin/master' have diverged,
# and have 3 and 8 different commits each, respectively.
#   (use "git pull" to merge the remote branch into yours)

Tôi muốn loại bỏ 3 cam kết cục bộ và kéo 8 cam kết từ xa tại origin / master.

(Việc hợp nhất sẽ quá khó khăn, tôi muốn thực hiện lại 3 cam kết cục bộ một lần nữa khi tổng thể được cập nhật.)

Tôi có thể làm cái này như thế nào?

Câu trả lời:


213
git fetch origin
git reset --hard origin/master

19
Cho đến nay câu trả lời tốt nhất mà tôi đã thấy. Đối với bất kỳ ai đang sử dụng tính năng này, mọi cam kết không được đẩy hoặc thay đổi cục bộ sẽ chỉ bị mất FYI.
DemitryT

4
bạn có thể làm gì git reset origin/mastermà không --hardlàm việc thay đổi thư mục không bị mất?
khôn ngoan

Làm việc cho tôi. Đó là giải pháp hoàn hảo.
Uttam Panara

Tôi thấy một thông báo tương tự nhưng đối với nhánh không phải chính khi tôi căn cứ lại nó thành chính mới nhất. Một lực kéo sẽ làm gì trong trường hợp đó? Tôi có nên kéo không? Tôi muốn cam kết của mình về những thay đổi mới nhất.
Rajeev Ranjan

@RajeevRanjan: Pull sẽ (cố gắng) hợp nhất trong các thay đổi hiện có của bạn. Đặt lại sẽ ném chúng đi.
SLaks

29

Để duy trì các cam kết cũ của bạn trên một nhánh tạm thời trong trường hợp bạn cần:

git branch temp

Sau đó chuyển sang trang cái mới

git fetch origin
git reset --hard origin/master

Vậy trong trường hợp này anh ta có chi nhánh của mình không? Ví dụ, nếu anh ta đang làm việc trong 'mydevbranch' thì chi nhánh tạm thời này có chỉ đơn giản là tạo ra một chi nhánh sao chép mới của mydevbranch không? Nó có vẻ như một biện pháp phòng ngừa theo cách bạn đặt nó trong trường hợp họ cần thiết, họ có trong bản sao này ..
đã hạ cánh vào

1
Vâng, đây là một biện pháp phòng ngừa. Nó chỉ đảm bảo rằng các cam kết không bị mất nếu bạn cần chúng trong tương lai.
jdramer

Theo trực giác, tôi sẽ nghĩ rằng bạn cần phải nhập mã cục bộ của mình trước khi thực hiện việc này - và đó là vấn đề vì bạn không muốn những gì bạn vừa làm đi ngược dòng. Tôi đoán bạn bắt đầu cục bộ và không đẩy - nhưng cuối cùng nó sẽ cần phải tăng lên ... đó là điều không mong muốn mà tôi đang giả định. Một nhánh dành cho một biến thể hoặc một tính năng khác nhưng nó cần phải xảy ra từ trạng thái kết hợp? Hoặc có thể đó là những gì bạn đang nói. Có lẽ tôi KHÔNG cần lo lắng về việc trang bị - Tôi chỉ nghĩ rằng chi nhánh lấy một bản sao từ nguồn gốc nguồn được trang bị (mất các thay đổi cục bộ)
đã hạ cánh

@landed: vâng, bạn sẽ cam kết các thay đổi cục bộ của mình sau khi tạo chi nhánh temp. Bạn có thể sau đó, nếu bạn muốn khôi phục một số cam kết đó, hãy chọn chúng (xem git help cherry-pick).
Cris Luengo

5

Hãy thử làm điều này để loại bỏ các cam kết địa phương của bạn:

git reset --hard HEAD~4

3

Để thay thế cho việc hợp nhất, bạn có thể căn cứ lại nhánh tính năng thành nhánh chính bằng các lệnh sau:

git checkout feature
git rebase master

2

Nếu khôi phục cài đặt gốc không cắt được nó cho bạn và bạn không muốn thực hiện hợp nhất kéo, bạn có thể loại bỏ các thay đổi không mong muốn cục bộ của mình bằng cách xóa chi nhánh cục bộ của bạn và tải xuống lại chi nhánh gốc:

git branch -D <local branch>
git checkout -b <branch name> origin/<branch name>

Sử dụng masterlàm ví dụ:

git branch -D master
git checkout -b master origin/master

Nếu nhánh cục bộ được phân tách khỏi 'origin / <branch>', nó không cho phép xóa nhánh cục bộ.
Anirban

1

Để xóa bản cam kết cục bộ mới nhất của bạn, hãy sử dụng như sau:

git reset HEAD^

Thao tác này sẽ đưa tiêu đề trở lại trạng thái trước đó đối với cam kết và sẽ cho phép bạn git pull từ trang chủ. Đảm bảo rằng bạn lưu tất cả các thay đổi của mình ở nơi khác (cục bộ) trước khi kéo từ kho lưu trữ từ xa.

Để có thể kéo mà không có xung đột git stash, hãy sử dụng , và sau đó git pull.

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.