2013-03-01 31 views
12

Gần đây tôi đã bắt đầu sử dụng GitHub for Windows.Trên mâu thuẫn, GitHub cho Windows đặt tôi vào trạng thái "rebasing", cách đi từ đó?

Tôi vừa bị xung đột. Trên dòng lệnh tôi sẽ biết làm thế nào để xử lý này, nhưng GitHub cho Windows chọn lựa để đưa tôi trong tình trạng tôi không quen thuộc với:

C:\Users\w\Documents\GitHub\CmisSync [(6026d18...)|REBASE +0 ~1 -0 !1 | +0 ~0 -0 !1]> git status 
# Not currently on any branch. 
# You are currently rebasing. 
# (fix conflicts and then run "git rebase --continue") 
# (use "git rebase --skip" to skip this patch) 
# (use "git rebase --abort" to check out the original branch) 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
... 

Tôi cố định cuộc xung đột, cam kết các tập tin, nhưng khi tôi chạy git push tôi được nói:

fatal: You are not currently on a branch. 
To push the history leading to the current (detached HEAD) state now, use 

    git push origin HEAD:<name-of-remote-branch> 

Cách được khuyến nghị để kết hợp cam kết của tôi với chủ từ xa là gì?
Tôi nghi ngờ git push origin HEAD:master sẽ đạt được điều này.

Trả lời

18

Khi chúng tôi nói với Simon Boudrias, nếu bạn không thực sự biết những gì bạn đã làm trong quá trình rebase, điều tốt nhất để bắt đầu là với git rebase --abort. Khi động từ nói, nó hủy bỏ việc rebase hiện tại, và để lại cho bạn kho lưu trữ và bản sao làm việc của bạn trong cùng một trạng thái trước khi khởi động lại.

Sau đó, bạn nên làm bất cứ điều gì bạn đã làm mà bắt đầu quá trình rebase (tôi không nghĩ bạn đã nói nó là gì, nhưng cũng không nghĩ nó thực sự quan trọng). Chắc chắn việc rebase sẽ bắt đầu lại, và đây là nơi câu hỏi ban đầu của bạn bắt đầu được trả lời.

Khi đầu ra trạng thái cho biết, dường như bạn có xung đột. Bạn nên giải quyết chúng (Tôi thường sử dụng git status --short cộng git mergetool để giải quyết chúng với meld), sau đó git add các tệp. Khi trạng thái OK (ví dụ: mọi tệp cần phải được thêm vào, không có xung đột), bạn nên git rebase --continue thay vì git commit.

Ý tưởng là git rebase áp dụng một nhóm các cam kết trên đầu trang của một cam kết nhất định. Tôi không thực sự biết những gì cam kết đang được áp dụng trên đầu trang của những gì, nhưng điều quan trọng là phải có điều đó trong tâm trí. Hãy nhớ rằng có thể hiển thị nhiều xung đột, bởi vì các cam kết áp dụng từng cái một. Sử dụng git log để xem cam kết cuối cùng được áp dụng là gì và tôi nghĩ rằng phải có một tệp trong thư mục .git/ của bạn với thông báo cam kết của cam kết hiện đang được áp dụng.

Đó là lỗi newbie commmon (tất cả chúng ta đã có :)) để cố gắng bao gồm các thay đổi trong tệp trong khi giải quyết xung đột mà không biết (hoặc quên) chúng sẽ được áp dụng bởi cam kết sau. Vì vậy, hy vọng, sau khi giải quyết một số xung đột, thêm các tệp và git rebase --continue nhập chúng, bạn sẽ đến một kho lưu trữ chức năng vui vẻ và bạn sẽ có thể git push từ đó trở đi.

Cuối cùng, nhưng không kém phần quan trọng: sau tất cả các công cụ rebase, hãy sử dụng git log để kiểm tra bạn không sửa đổi bất kỳ cam kết công khai nào.Nói rằng nhánh mới của bạn chứa commit HEAD của remote. Rebasing mạnh mẽ và rất nguy hiểm. Bạn không muốn rebase một cam kết công cộng - nó có thể là đau git duy nhất bạn không muốn phải đối mặt :)

+0

ý của bạn là gì bằng cách "kiểm tra bạn không sửa đổi bất kỳ cam kết công khai nào"? –

1

Trước tiên, bạn cần kết thúc chế độ rebase bằng cách gọi git rebase --continue sau khi bạn giải quyết xung đột của mình. Điều này sau đó sẽ đưa bạn trở lại trên nhánh bạn đang kéo (trong trường hợp chủ của bạn). Bạn sẽ nhận thấy điều này xảy ra khi dòng lệnh (plugin posh-git) sẽ chỉ ra master thay vì REBASE

Sau đó, bạn có thể đẩy sử dụng git push origin master. Các thông số bổ sung có thể được Git tự động điền, nhưng điều đó sẽ tùy thuộc vào cài đặt của bạn.

+1

Tại thời điểm này, ông có thể đã thực hiện một mớ hỗn độn trong khi cố gắng để cam kết và đẩy trong một rebase. Chạy 'git rebase --abort' và thực hiện lại các hành động khiến bạn bị xóa bỏ có vẻ là một ý tưởng hay. – mgarciaisaia

+0

Điểm tốt, đó là thời điểm tốt để hủy bỏ và bắt đầu lại khi bạn đã thực hiện một mớ hỗn độn. Cảm ơn bạn đã thêm điều này. –

+0

Simon, tôi đã thử làm điều này, nhưng tôi đã nhận 'Không có thay đổi - bạn đã quên sử dụng' git add '? ', Vì vậy tôi đã làm chính xác những gì @ desert69 đã làm, và điều đó đã làm việc. @ desert69, bạn có thể vui lòng đăng ý tưởng của mình làm câu trả lời không? Cảm ơn bạn! –