Làm thế nào để loại bỏ các cam kết cục bộ trong Git?


263

Tôi đã làm việc với một cái gì đó, và quyết định rằng nó đã hoàn toàn sai lầm ... sau khi đã cam kết một số thứ. Vì vậy, tôi đã thử trình tự sau:

git reset --hard
git rebase origin
git fetch
git pull
git checkout

Tại thời điểm đó tôi nhận được tin nhắn

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

Tôi muốn loại bỏ các cam kết cục bộ của mình , mà không phải xóa sạch thư mục địa phương và tải lại mọi thứ. Làm thế nào tôi có thể hoàn thành nó?


6
Không cần phải làm cả hai git fetchgit pull- pull là sự kết hợp giữa tìm nạp và hợp nhất.
Ether

12
Lưu ý cho người dùng: vấn đề chính của câu hỏi này không liên quan gì đến thông báo "Chi nhánh của bạn đi trước 'origin / master' bởi N cam kết." . Vui lòng ngừng đóng các câu hỏi khác dưới dạng trùng lặp của câu hỏi này vì thông báo đó.

Câu trả lời:


581
git reset --hard origin/master

sẽ xóa tất cả các xác nhận không phải ở origin/masterđâu originlà tên repo và masterlà tên của chi nhánh.


1
Tôi nghĩ cú pháp "origin / master", với dấu gạch chéo, được gọi là repo cục bộ?
Daniel C. Sobral

9
mipadi: Đặt chính xác hơn, nó sẽ thiết lập lại nhánh hiện tại để trỏ đến cùng một cam kết như gốc / chủ.
Christoffer Hammarström

Nó đề cập đến một chi nhánh. origin/masterlà một nhánh theo dõi masternhánh của originrepo từ xa.
mipadi

@ DanielC.Sobral Không, origin/masterlà một tham chiếu đến masternhánh của điều khiển từ xa được gọi origin.
Matthew

1
@littletiger git không theo dõi các thư mục, chỉ các tệp và đường dẫn của chúng. Do đó, nó sẽ hoàn toàn bỏ qua các thư mục trống (các thư mục không có tệp hoặc chỉ bỏ qua các tệp). Họ không xuất hiện ở bất cứ đâu vì không có gì để đi trong đó.
Mumbledkates

33

Bên cạnh đó, ngoài câu trả lời của mipadi (nên hoạt động theo cách này), bạn nên biết rằng làm:

git branch -D master
git checkout master

cũng làm chính xác những gì bạn muốn mà không có having to redownload everything(trích dẫn của bạn diễn giải). Đó là bởi vì repo cục bộ của bạn chứa một bản sao của repo từ xa (và bản sao đó không giống với thư mục cục bộ của bạn, nó thậm chí không giống với chi nhánh đã kiểm tra của bạn).

Xóa sạch một chi nhánh là hoàn toàn an toàn và tái tạo lại chi nhánh đó rất nhanh và không liên quan đến lưu lượng mạng. Hãy nhớ rằng, git chủ yếu là một repo địa phương theo thiết kế. Ngay cả các chi nhánh từ xa có một bản sao trên địa phương. Chỉ có một chút siêu dữ liệu cho git biết rằng một bản sao cục bộ cụ thể thực sự là một nhánh từ xa. Trong git, tất cả các tệp đều nằm trên đĩa cứng của bạn mọi lúc.

Nếu bạn không có bất kỳ chi nhánh nào ngoài chủ, bạn nên:

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp

4
Nhưng làm thế nào để phân biệt các cam kết được thực hiện tại địa phương từ các cam kết được thực hiện tại nguồn gốc? Trên thực tế, nó cho tôi biết điều đóCannot delete the branch 'master' which you are currently on.
Daniel C. Sobral

1. Về cơ bản tất cả các cam kết là như nhau, bất kể chúng được thực hiện tại địa phương hoặc tại nguồn gốc. Điều quan trọng là lịch sử được đồng bộ hóa chính xác. Cam kết cục bộ của bạn sẽ chỉ tồn tại tại nguồn gốc sau khi bạn đẩy chúng và theo mặc định, git sẽ từ chối việc đẩy nếu lịch sử tại điểm gốc có thể kết thúc ở trạng thái không có ý nghĩa.
slebetman

2
2. Tất nhiên bạn không thể xóa chi nhánh hiện đang được kiểm tra. Để xóa master, hãy kiểm tra một nhánh khác trước. Nếu không có chi nhánh nào khác chỉ cần tạo một chi nhánh tạm thời:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
slebetman

Cũng lưu ý về những gì tôi đã nói về bản sao cục bộ của repo từ xa khác nhau: git sẽ không cho phép bạn chỉnh sửa hoặc thậm chí xem các tệp trong bản sao của chi nhánh từ xa. Nó sẽ chỉ cho phép bạn tạo một nhánh khác từ nhánh từ xa mà sau đó bạn có thể xem và chỉnh sửa. Theo quy ước, chi nhánh địa phương này có cùng tên với chi nhánh từ xa. Bạn có một phần đúng trong đó origin/masterlà trên máy cục bộ của bạn. Đó là bản sao địa phương (đầy đủ) của chi nhánh từ xa. Các chi nhánh từ xa thực sự là origin master.
slebetman

Điều này làm việc cho tôi. Có lẽ điều đó git branch -D masterlà không cần thiết, vì như đã chỉ ra nó tạo ra lỗi.
Alexis Wilke

15

Những gì tôi làm là tôi cố gắng thiết lập lại khó khăn để ĐẦU. Điều này sẽ xóa sạch tất cả các cam kết cục bộ:

git reset --hard HEAD^

Đây là câu trả lời tốt nhất, mà thực sự làm việc. Đã hủy tất cả các xác nhận cục bộ và đặt lại về CHÍNH. Sử dụng ^ char là gì?
karim

@karim '^' có lẽ là thứ regex, có lẽ là thứ gì đó khá sâu mà tôi không biết hoặc đọc từ lâu trong tệp hướng dẫn .. xin lỗi người đàn ông :)
giang nguyen

1
Tuy muộn, nhưng ^đại diện cho cam kết cha mẹ, vì vậy, đặt lại để HEAD^loại bỏ các thay đổi không được cam kết và chuyển chi nhánh sang cam kết trước đó, "xóa" cam kết gần đây nhất (mặc dù cam kết vẫn tồn tại, chi nhánh không chỉ đến nó). Câu trả lời sẽ chỉ có một cam kết cục bộ và phần còn lại là những thay đổi không được cam kết. @karim @giang
QuantumQuaver

3

Bạn cần phải chạy

git fetch

Để có được tất cả các thay đổi và sau đó bạn sẽ không nhận được thông báo với "chi nhánh của bạn đang ở phía trước".


5
Tìm nạp không liên quan gì đến vấn đề chính của người hỏi, đó là loại bỏ các cam kết cục bộ.

1
Điều gì xảy ra nếu tôi đã cam kết các tệp trong cục bộ và sau đó cố gắng kích hoạt lệnh được đề cập. Nó sẽ hiển thị thông báo lỗi tương tự. Tôi cũng đã thử git fetch và git fetch -p. nhưng hiển thị cùng một lỗi
Morez

1

Tôi đã thấy các trường hợp điều khiển từ xa không đồng bộ và cần được cập nhật. Nếu một reset --hardhoặc branch -Dkhông làm việc, hãy thử

git pull origin
git reset --hard 

điều này không trả lời câu hỏi, một reset --hardtác phẩm trong tình huống này
CharlesB

1
Xin chào Charles, bạn đúng mà reset --hardnên làm việc ở đây. Tuy nhiên, tôi chỉ đơn giản chỉ ra rằng đôi khi không thể thiết lập lại nhánh chính xác và git pull originsẽ đồng bộ lại điều khiển từ xa và cho phép reset --hardhoạt động đúng.
Jim Clouse

0

Tôi đã phải làm một:

git checkout -b master

như git nói rằng nó không tồn tại, bởi vì nó đã bị xóa sạch

git -D master
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.