2012-06-06 21 views
72

Tôi tò mò về cách loại bỏ cam kết đầu tiên trong git.Làm cách nào để xóa cam kết đầu tiên trong git?

Bản sửa đổi trước khi thực hiện bất kỳ điều gì? Bản sửa đổi này có tên hoặc thẻ không?

+2

Đối với một sự khởi đầu với git, bạn nên biết rằng phiên bản Là vô nghĩa. Bạn có thể nói về cam kết hoặc SHA tương đối của họ. Ngoài ra, tại sao bạn muốn làm điều này? Cam kết đầu tiên là mọi thứ được xây dựng trên đó. Bạn có thể squash một vài commit với nhau, bao gồm commit đầu tiên, trở thành commit đầu tiên mới, nhưng nó có nghĩa là xóa bỏ commit đầu tiên (hoặc xóa bất kỳ commit nào nhưng commit cuối cùng)? – Shahbaz

+0

@Shahbaz yeah, đó là cách tốt nhất, hãy xem tại đây ví dụ: http://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one – timaschew

+4

Bạn có thể sử dụng 'git rebase - i --root'. Xem câu trả lời SO sau đây để biết chi tiết: http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git – MKroehnert

Trả lời

122

Đối với tôi, cách an toàn nhất là sử dụng update-ref lệnh:

git update-ref -d HEAD 

Nó sẽ xóa tên tài liệu tham khảo HEAD, vì vậy nó sẽ reset (nhẹ nhàng, bạn sẽ không mất công việc của bạn) tất cả các bạn cam kết của chi nhánh hiện tại của bạn.

Nếu những gì bạn muốn là để hợp nhất đầu tiên cam kết với một thứ hai, bạn có thể sử dụng rebase lệnh:

git rebase -i --root 

Một cách cuối cùng có thể là để tạo ra một chi nhánh trẻ mồ côi, một chi nhánh với nội dung tương tự nhưng không có bất kỳ cam kết lịch sử, và cam kết nội dung mới của bạn trên đó:

git checkout --orphan <new-branch-name> 
+2

Thật tệ vì đây không phải là câu trả lời được chấp nhận. Nó cũng quá xấu mà hầu hết các truy cập trên google nhiều hơn hoặc ít hơn nói "bạn không thể hoàn tác các cam kết đầu tiên". Điều này đã làm cho các trick cho tôi. Cảm ơn! – danielpops

+1

Cảm ơn @danielpops đã hỗ trợ bạn! Thật tốt khi nhận thấy rằng tôi đã trả lời câu hỏi này 3 năm sau đó. Git đã phát triển trong thời gian chờ đợi. – tzi

+0

Chi nhánh trẻ mồ côi đã thực hiện thủ thuật. Cảm ơn bạn! – fanaugen

36

Không có gì trước cam kết đầu tiên, vì mọi cam kết đều đề cập đến một cam kết gốc. Điều này làm cho cam kết đầu tiên đặc biệt (một cam kết trẻ mồ côi), vì vậy không có cách nào để tham chiếu đến một "trạng thái" trước đó.

Vì vậy, nếu bạn muốn sửa cam kết, bạn có thể chỉ cần git commit --amend: điều này sẽ sửa đổi cam kết mà không tạo một số khác.

Nếu bạn chỉ muốn bắt đầu lại tất cả, xóa các kho .git, và làm cho nhau với git init

+1

Câu trả lời này không chính xác: có cách để hoàn nguyên trạng thái trước cam kết đầu tiên. Xem [câu trả lời của tzi] (http://stackoverflow.com/a/32765827/46783) bên dưới. –

2

Nếu bạn muốn giữ lại các chi nhánh khác, nhưng ví dụ làm cho chi nhánh tổng thể bắt đầu lại không có tiền sử thường khác chi nhánh, một cách an toàn để đạt được điều này là để tạo ra một kho lưu trữ mới, và đẩy nội dung đó trong bạn cũ:

cd .. 
git init newrepo 
cd newrepo 
# make some initial commits 
git push ../oldrepo master:newmaster 

Điều này tạo ra "newmaster" chi nhánh tại các kho cũ, với lịch sử đó không phải là điểm chung với bất kỳ chi nhánh nào khác. Tất nhiên, bạn cũng có thể ghi đè lên master, với `git push -f´.

Nếu bạn muốn hủy tất cả các nhánh và tất cả nội dung hiện có, thì chỉ cần chạy rm -rf .git/.

5

Bạn có thể chỉ muốn chỉnh sửa cam kết đầu tiên của mình (vì luôn có cam kết đầu tiên trong một repo git). Cân nhắc sử dụng git commit --amend --reset-author thay vì thông thường git commit --amend.

2

Một cách khác bạn có thể làm là:

  1. Checkout để một chi nhánh mà bạn muốn giữ (nói dev) git checkout dev
  2. Bây giờ, xóa các chi nhánh bạn muốn đặt lại git branch -D master
  3. Bây giờ, tạo ra một chi nhánh trống có cùng tên git checkout --orphan master

Tất nhiên, tất cả điều này phụ thuộc vào việc sử dụng của bạn, nhưng nếu bạn có nhiều chi nhánh, hãy xóa t anh ta .git thư mục không có ý nghĩa.

+1

Sau khi thực hiện việc này, bạn phải xóa nhánh trong điều khiển từ xa trước khi đẩy. Nếu không, khi cố đẩy bạn sẽ có lỗi này:! [bị từ chối] master -> master (non-fast-forward) - lỗi: không thể đẩy một số refs đến '[email protected]: r1/r2.git' - gợi ý: Cập nhật đã bị từ chối bởi vì đầu của nhánh hiện tại của bạn là phía 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 ... - Nếu bạn thực hiện lệnh git, tất cả các commit sẽ trở lại. – dxvargas

2

Kiểm tra ra một chi nhánh tạm thời:

git checkout --orphan TEMP_BRANCH

Thêm tất cả các tập tin:

git add -A

Cam kết những thay đổi:

git commit -am "Initial cam kết"

Xóa chi nhánh cũ:

git branch -D master

Đổi tên chi nhánh tạm thời để làm chủ:

git branch -m chủ

Cuối cùng, lực lượng cập nhật kho của chúng tôi:

git push -f nguồn gốc chủ

Các vấn đề liên quan