2010-02-11 25 views
328

Tôi muốn thay đổi một cái gì đó trong cam kết đầu tiên của dự án của tôi với mất tất cả các cam kết tiếp theo. Có cách nào để làm điều này không?Thay đổi cam kết đầu tiên của dự án với Git?

Tôi vô tình liệt kê email thô của mình trong nhận xét bên trong mã nguồn và tôi muốn thay đổi email khi tôi bị spam lập chỉ mục chương trình GitHub.

Trả lời

484

Như đã đề cập bởi ecdpalmabelow, git 1.7.12+ (tháng 8 năm 2012) đã tăng cường các lựa chọn --root cho git rebase:

"git rebase [-i] --root $tip" hiện có thể được sử dụng để ghi lại tất cả lịch sử dẫn đến "$tip" xuống đến cam kết gốc.

Đó hành vi mới là bước đầu discussed here:

Cá nhân tôi nghĩ "git rebase -i --root" nên được thực hiện để chỉ làm việc mà không đòi hỏi "--onto" và cho phép bạn "chỉnh sửa" ngay cả những người đầu tiên trong lịch sử.
Có thể hiểu được rằng không ai bận tâm, vì mọi người ít thường xuyên viết lại gần đầu lịch sử hơn là khác.

patch followed.


(câu trả lời ban đầu, tháng 2 năm 2010)

Như đã đề cập trong Git FAQ (và SO question này), ý tưởng là:

  1. Tạo chi nhánh tạm thời mới
  2. Tua lại nó vào cam kết bạn muốn thay đổi bằng cách sử dụng git reset --hard
  3. Thay đổi cam kết đó (nó sẽ là đầu HEAD hiện tại và bạn có thể sửa đổi nội dung của bất kỳ tập tin)
  4. chi nhánh rebase trên đầu trang của thay đổi cam kết, sử dụng:

    git rebase --onto <tmp branch> <commit after changed> <branch>` 
    

Bí quyết là để đảm bảo các thông tin mà bạn muốn loại bỏ không được giới thiệu lại bởi một sau cam kết ở một nơi khác trong tệp của bạn. Nếu bạn nghi ngờ rằng, sau đó bạn phải sử dụng filter-branch --tree-filter để đảm bảo nội dung của tệp đó không chứa trong bất kỳ cam kết thông tin hợp lý nào.

Trong cả hai trường hợp, bạn kết thúc viết lại SHA1 của mọi cam kết, vì vậy hãy cẩn thận nếu bạn đã xuất bản chi nhánh bạn đang sửa đổi nội dung.Có thể bạn không nên làm điều đó trừ khi dự án của bạn chưa được công khai và những người khác không dựa vào những cam kết bạn sắp viết lại.

+4

Trên OS X Mountain Lion với hệ thống cài đặt git 1.7.9.6 (Apple Git-31.1) tôi đặt '' để là cùng một băm tôi đã sử dụng trong lệnh 'git reset --hard'. Bên cạnh đó một thay đổi nhỏ, điều này hoạt động tốt đẹp để cập nhật thông tin tác giả trên tất cả các cam kết trong một repo. – berto

+4

bạn có thể cung cấp ví dụ về những gì nên là $ tip. 'git rebase -i --root' làm việc cho tôi. –

+0

@ RémiBenoit có, '$ tip' có thể là bất kỳ cam kết nào bạn muốn. 'master' (nghĩa là' master HEAD' commit) là tốt. – VonC

0

Nếu bạn muốn thay đổi chỉ là người đầu tiên cam kết, bạn có thể thử git rebase và sửa đổi các cam kết, mà là tương tự như bài này: How to modify a specified commit in git?

Và nếu bạn muốn thay đổi tất cả các cam kết có chứa các nguyên email, bộ lọc-chi nhánh là sự lựa chọn tốt nhất. Có một ví dụ về cách thay đổi địa chỉ email trên toàn cầu trên sổ Pro Git, và bạn có thể tìm thấy liên kết này hữu ích http://git-scm.com/book/en/Git-Tools-Rewriting-History

71

git rebase -i cho phép bạn chỉnh sửa thuận tiện mọi cam kết trước đó, ngoại trừ cam kết gốc. Các lệnh sau đây cho bạn biết cách thực hiện việc này theo cách thủ công.

# tag the old root, "git rev-list ..." will return the hash of first commit 
git tag root `git rev-list HEAD | tail -1` 

# switch to a new branch pointing at the first commit 
git checkout -b new-root root 

# make any edits and then commit them with: 
git commit --amend 

# check out the previous branch (i.e. master) 
git checkout @{-1} 

# replace old root with amended version 
git rebase --onto new-root root 

# you might encounter merge conflicts, fix any conflicts and continue with: 
# git rebase --continue 

# delete the branch "new-root" 
git branch -d new-root 

# delete the tag "root" 
git tag -d root 
+10

Tôi đã làm theo các hướng dẫn này như một n00b và chúng hoạt động hoàn hảo - cảm ơn! Bạn có thể muốn đề cập đến việc thêm '-a' vào' git commit --amend' hoặc sử dụng 'git add' vì tôi đã quên lần đầu tiên! –

+1

Điều này không còn đúng, vui lòng tham khảo câu trả lời được chấp nhận –

+0

Cảm ơn rất nhiều câu trả lời của bạn. Tôi đang sử dụng một Centos 7 và phiên bản git là 1.7.1 với rất nhiều hạn chế về lệnh. Câu trả lời được chấp nhận không hoạt động đối với tôi và _ ** cách làm thế nào để ** _ làm việc như một sự quyến rũ để xây dựng lại lịch sử kho lưu trữ từ _ ** commit ban đầu ** _ –

126

Như đã nêu trong 1.7.12 Release Notes, bạn có thể sử dụng

$ git rebase -i --root 
+2

git phiên bản 1.7.9 than phiền: 'Bạn phải chỉ định - -onto khi sử dụng --root' –

+2

Nó hoạt động tốt với git 1.9.4 –

+2

Làm việc tuyệt vời cho tôi quá, bằng cách sử dụng git 1.9.4. –

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