Làm cách nào để thay đổi điểm chính của cam kết trong git?


75

Trong git, tôi đã thực hiện các cam kết đối với nhánh chính, khi thực sự tôi nên làm việc trên một nhánh tính năng. Tôi muốn thay đổi điều này để cái chính trở lại nơi nó bắt đầu và những gì đã có trên cái chính bây giờ là trên một nhánh mới. Về cơ bản, lịch sử cam kết của tôi trông như thế này:

A -- B -- C -- D -- E
          |         |
          |       master
     origin/master

Và tôi muốn nó trông như thế này:

        master
          |
A -- B -- C -- D -- E
          |         |
          |       new_branch
     origin/master

Làm cách nào để thay đổi điểm chính?

Câu trả lời:


76
  • lưu trữ chưa cam kết của bạn: git stash
  • tạo một nhánh mới: git branch new_branch
  • đặt lại cái chính về điểm gốc / cái: git reset --hard origin/master
  • kiểm tra lại chi nhánh mới: git checkout new_branch
  • gỡ bỏ các thay đổi của bạn: git stash pop

stash / unash là không cần thiết nếu cây làm việc của bạn sạch sẽ. chỉ cần đảm bảo không có thay đổi nào trong cây làm việc của bạn, vì chúng sẽ bị xóa khi bạn đặt lại --hard


một khả năng khác (nhanh hơn và không cần lưu trữ và đặt lại):

  • kiểm tra một chi nhánh mới: git checkout -b new_branch master
  • tạo một nhánh chính 'mới' và trỏ nó đến gốc / cam kết của chủ: git branch -f master origin/master

2
Lưu ý rằng kho lưu trữ chỉ cần thiết nếu bạn có bất kỳ thay đổi nào chưa được cam kết.
Josh Lee

1
Nếu thư mục làm việc của bạn sạch sẽ, bạn sẽ không cần các phần stashunstash. Nếu không thì hoàn hảo: +1
Cameron Skinner

10
Tuyệt vời! git reset --hard <commit>chính xác là những gì tôi đang tìm kiếm.
Rudd Zwolinski

3
Bạn thực sự không nên sửa đổi các tệp .git/refs/bằng tay (đối với một, bất kỳ tham chiếu nhất định nào thực sự có thể được đóng gói (vào .git/packed-reftệp) thay vì "lỏng lẻo"). Nói chung, lệnh cấp thấp nhất mà bạn nên sử dụng để sửa đổi một ref là git update-ref hoặc git Symbol-ref . Trong trường hợp cụ thể này, không cần thiết phải sử dụng Git bên trong hoặc thậm chí sử dụng các lệnh Git "ống nước" đã đề cập trước đó; bạn có thể làm điều đó với git branch : git branch -f master origin/master.
Chris Johnsen

4
git branch -f master <commit>đã làm thủ thuật cho tôi, cảm ơn!
danr

27
$ git checkout master
$ git reset --hard <commit-id-for-master-to-sit-at>

ví dụ hãy thử cái này

$ mkdir example; cd example
$ git init
$ vi testFile.txt
(now add "test commit 1" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 1st commit" to git commit)
$ vi testFile.txt
(now add "test commit 2" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 2nd commit" to git commit)
$ vi testFile.txt
(now add "test commit 3" to line 1 of file)
$ git add *
$ git commit
(add message "(+) 3rd commit" to git commit)
$ git tag final_head
$ git reset --hard HEAD~1

ví dụ này cho thấy việc chuyển cái chính sang một cam kết khác. Lưu ý ở đây rằng thẻ cho phép chúng tôi lưu bản gốc cũ, trong trường hợp :)


4

Giống như đã nêu ở đây , nhưng thậm chí còn đơn giản hơn, không liên quan đến việc đặt lại, chỉ cần tạo một nhánh mới ở vị trí chính, sau đó xóa chính một cách dễ dàng, kiểm tra lại nơi bạn muốn chuyển chính đến và tạo một nhánh chính mới ở đó:

git stash
git checkout -b old_master_was_here
git branch -d master
git checkout origin/master
git checkout -b master

3

Truy cập .git / refs / heads / master có hàm băm chính và thay đổi nó thành bất kỳ thứ gì bạn muốn. Tôi sử dụng gitg để nhanh chóng tìm ra hàm băm chính và sau đó để xác minh rằng việc di chuyển đã thành công.


0

Tạo một nhánh mới new_branchtại HEAD hiện tại (giả sử HEAD = chính), đặt lại chủ thành C và chuyển sang new_branchlại (nói theo thuật ngữ của SmartGit).


0

Lưu ý rằng tại bất kỳ thời điểm nào, bạn có thể thay đổi nơi nhánh trỏ đến bằng cách sử dụng git update-ref refs/heads/branch id, nhưng trước khi làm điều này, bạn phải đặt tên cho ngọn của cây, nếu không công việc của bạn sẽ không thể truy cập được. Vì vậy, hai lệnh này có thể thực hiện công việc

 git update-ref refs/heads/newfeature HEAD
 git update-ref refs/heads/master XXYYY

Nhưng hãy đảm bảo rằng bạn không có bất kỳ thay đổi không giới hạn nào nếu không mọi thứ sẽ tan vỡ

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.