2011-01-27 38 views
5

Git là một công cụ phi thường, nhưng tôi chưa tập trung vào cách tốt nhất để hoàn tác các thay đổi đã được đẩy. Đây là tình huống.Git: sử dụng hoàn nguyên hoặc thanh toán để hoàn tác các thay đổi đã được đẩy?

Tôi đang ở trên chi nhánh và đã đẩy nhiều cam kết vào GitHub. Nó đã được quyết định rằng tôi đã đi quá xa xuống hố thỏ, và chúng tôi cần phải loại bỏ một số các cam kết tôi đã làm, và bắt đầu lại. Về cơ bản, tôi cần phải đảo ngược tất cả các cam kết đã được đẩy, quay trở lại một cam kết trước đó. Dưới đây là hai lệnh mà chúng tôi nghĩ phù hợp

git revert # - creates a new commit that "undoes" the changes of one specific commit 
git checkout 'commit SHA' # - sets the head to that specific commit, wherein I will re-push to the repo, undoing my changes... I think 

Vì vậy, tôi phải không? Tôi có cần thực hiện thanh toán git trên cam kết cụ thể mà tôi muốn quay lại không? Hay có điều gì đó trong quá trình phức tạp này mà tôi không hiểu?

Cảm ơn.

Trả lời

-3

Hãy thử git reset: http://git-scm.com/docs/git-reset

+0

Git reset có hoạt động trên các cam kết đã được đẩy không? –

+0

Điều này sẽ làm ảnh hưởng của việc thanh toán, như người hỏi cho biết, mà không cần đặt lại các tệp cục bộ (mặc dù tất nhiên bạn có thể làm những điều thú vị hơn với các tùy chọn có sẵn). Nhưng hiệu quả về những gì bạn làm cho lịch sử với các cam kết tiếp theo sẽ giống nhau. – ijw

+1

Điều đó đã hiệu quả. Theo hướng dẫn này - http://www.opentaps.org/docs/index.php/How_to_Use_Git:_a_Tutorialtutorial và có vẻ như nó đã hoạt động. –

-1

Như Horia chỉ ra một cách chính xác bạn sẽ cần phải thiết lập lại git.

Thanh toán Git nghĩa là bạn chuyển sang một chi nhánh khác hoặc bằng cách sử dụng checkout -B bạn có thể tạo chi nhánh mới và chuyển sang nhánh đó ngay lập tức.

5

Có hai kịch bản tùy thuộc vào tình trạng của những gì bạn đẩy:

  • ai đã sử dụng các chi nhánh đẩy cho bất cứ điều gì được nêu ra. Trong trường hợp đó, bạn có thể sử dụng git reset để buộc chi nhánh địa phương thực hiện một cam kết cụ thể - và sau đó bạn có thể git push chi nhánh có thông số --force.

  • Nếu, tuy nhiên, có ai đó đã làm việc dựa trên nhánh bạn vô tình đẩy, thì bạn không thể đặt lại nó, vì sau đó anh ấy sẽ thay đổi chi nhánh của mình. Đây là nơi git revert phát huy tác dụng. Nó sẽ ghi lại một bản vá nghịch đảo có hiệu quả hoàn tác các thay đổi trước đó. Lợi thế ở đây là người khác có thể dựa vào công việc của họ trên nhánh một cách dễ dàng.

Lựa chọn phương pháp phụ thuộc vào kho lưu trữ của bạn và trong bao lâu các bản vá tình cờ được đặt ở đó. Nếu có ít nhà phát triển, giao tiếp và reset có lẽ là câu trả lời. Nhưng có điều đã sống trong một thời gian dài, nó có lẽ là tốt hơn để hoàn nguyên - trừ khi bạn muốn viết lại toàn bộ lịch sử!

Một cách khác để xem nó là: git revert là liên tục trong khi git reset/git push --force là viết lại phá hoại của lịch sử. Có một thời điểm thích hợp cho cả hai.

Cuối cùng, khi tôi đi theo Alice xuống hố Thỏ và điều tra những gì nằm ngoài, tôi thường làm điều đó trên các chi nhánh được tạo tại địa phương. Sau đó, nếu tôi thích những thay đổi, tôi thường kết hợp chúng thành một nhánh thử nghiệm và để chúng khuấy động một chút trên nhánh thử nghiệm, trước khi tôi hợp nhất chúng với master. Bằng cách đó bạn tránh được vấn đề rất nhiều thời gian. Tóm lại, tôi thường có 20-30 chi nhánh địa phương, một cho mỗi tính năng tôi đang làm việc. Họ có xu hướng được thử nghiệm riêng lẻ đầu tiên. Thỉnh thoảng, tôi tạo một chi nhánh mới test và hợp nhất tất cả mọi thứ vào nhánh đó và thực hiện tất cả các thử nghiệm với nhau. Để theo dõi xung đột trên các chi nhánh, tôi sử dụng git rerere. Ưu điểm là tôi có thể quyết định thời điểm một tính năng đủ ổn định để đẩy người khác.

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