2015-02-27 20 views
7

Tôi có một chi nhánh A và chi nhánh B (và một số chi nhánh khác).Git: đặt lại/hoàn nguyên toàn bộ chi nhánh về trạng thái chi nhánh khác?

phép nói rằng Một 's cam kết lịch sử trông giống như:

  • cam kết 5
  • cam kết 4
  • cam kết 3
  • ...

B Lịch sử cam kết của:

  • một số khác cam kết
  • cam kết 4
  • merge thứ khác từ chi nhánh C (vào chi nhánh B)
  • cam kết 3
  • ...

Về cơ bản những gì tôi muốn là "xóa" tất cả các thay đổi được thực hiện bởi các cam kết một số cam kết kháchợp nhất các nội dung khác từ chi nhánh C đến chi nhánh B.

Tôi muốn cây đang hoạt động của chi nhánh B giống hệt cây chi nhánh A.

Làm cách nào để đạt được điều này?

Trả lời

9

Một cách để đạt được điều này là thông qua git reset. Trong khi trên cành B thực hiện

git reset --hard A 

Sau đó, chi nhánh B điểm vào đầu-cam kết của A. Tùy chọn --hard đặt lại chỉ mục và cây làm việc để tất cả các tệp được theo dõi được đặt lại về phiên bản trong chi nhánh A. Cam kết cũ của A được sao chép sang .git/ORIG_HEAD để cho phép hoàn tác thay đổi.

Ngoài ra - trong khi không vào chi nhánh B - bạn có thể xóa chi nhánh B và tái tạo nó như thế này:

git branch -d B  # delete branch B 
git branch B A  # re-create branch B and let it point to the commit of branch A 

khác hơn so với đề nghị đầu tiên, điều này sẽ rời khỏi chỉ mục và làm việc cây hoang sơ.

+0

cảm ơn. reset --hard A chính xác là những gì tôi đang tìm kiếm. Tuy nhiên: làm thế nào để tôi đẩy cái này (nhánh được tái định cư) trở lại nguồn gốc? nguồn gốc từ chối đẩy, vì các cam kết phân tách .. – daniel451

+1

Bạn có thể thêm tùy chọn '--force' vào lệnh' push' để ghi đè nhánh từ xa. Nhưng bạn nên biết rõ về hậu quả như ví dụ: được mô tả [tại đây] (http://stackoverflow.com/questions/21259585/other-consequences-of-git-push-force) hoặc [tại đây] (http://stackoverflow.com/questions/23432788/git-push- lực lượng hậu trường). –

3

Nếu bạn muốn chi nhánh của mình B trông giống như chi nhánh A. Bạn chỉ có thể làm một số reset --hard

git checkout branch-B 

git reset --hard branch-A 

Hãy cẩn thận bạn sẽ mất cam kết trong trường hợp này.Nhánh B của bạn sẽ trông giống như nhánh A, bất kỳ cam kết nào được thực hiện cho nhánh B, không có trong nhánh A, sẽ bị mất. Ngoài ra nếu nhánh-B được chia sẻ với người khác, nó không được khuyến khích để thực hiện thao tác này.

Trong trường hợp đó bạn có thể thử quay trở lại các cam kết mà bạn không muốn trong ngành B

git revert <sha-of-"some other commit"> 
git revert <sha-of-"merge of other stuff from branch C (into branch B)"> 

Thứ hai cam trông giống như một hợp nhất cam kết, do đó bạn có thể phải vượt qua cha mẹ là tốt.

git revert <sha-of-"merge of other stuff from branch C (into branch B)"> -m1 
Các vấn đề liên quan