2011-08-19 24 views
172

Sử dụng git i làm somthing như thế nàygì để làm với cam kết thực hiện trong một đầu tách ra

git clone 
git checkout {a rev number tree rev before} (here i started to be in a detached head state) 
//hacking 
git commit 
//hacking 
git commit 
(some commit where made on origin/master) 
git pull (wich does complete because there was some error due to the fact that i'm no more on master) 

Bởi vì git nói với tôi rằng tôi vẫn có thể cam kết khi trong trạng thái đầu tách ra, tôi đã làm như vậy. Nhưng bây giờ tôi muốn kết hợp nhánh đầu tách rời với nhánh chủ cục bộ của tôi, và sau đó đẩy các thay đổi của tôi về nguồn gốc/chủ.

Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể kết hợp các chi nhánh tổng thể với tình trạng thực tế của tôi (đầu tách ra)

+0

thể trùng lặp của [Git: HEAD đã biến mất, muốn kết hợp nó vào chủ] (http://stackoverflow.com/questions/2519031/git-head-has-disappeared-want-to-merge- it-into-master) –

+0

Tôi có thể thêm ảnh chụp màn hình của cây cam kết trong trạng thái này (cách một cam kết trên một đầu tách ra thực sự trông giống như trong gitk hoặc SourceTree), điều đó sẽ làm cho câu hỏi này trở nên tốt hơn. – florisla

+0

Unfortunalty tại thời điểm này tôi không thể, nhưng nếu bạn có thể cung cấp trên, tôi sẽ được hạnh phúc để xem nó ở đây. Ngay cả khi nó phải là một trận hòa, nó sẽ làm cho nó rõ ràng hơn – benzen

Trả lời

281

Tạo một chi nhánh nơi bạn đang, sau đó chuyển sang làm chủ và hợp nhất nó:

git branch my-temporary-work 
git checkout master 
git merge my-temporary-work 
+4

làm thế nào để tránh tách đầu trong tương lai? – ycomp

+0

Tôi đã làm điều này và thấy mình có nguồn gốc từ 5 cam kết. Trong trường hợp đó, bạn chỉ cần làm git push origin? – Winnemucca

+0

@stevek Điều đó sẽ thực hiện thủ thuật. – juil

12

Bạn chỉ có thể làm git merge <commit-number> hoặc git cherry-pick <commit> <commit> ...

theo đề nghị của Ryan Stewart bạn cũng có thể tạo ra một chi nhánh từ các HEAD hiện tại:

git branch brand-name 

Hoặc chỉ cần một thẻ:

git tag tag-name 
+0

Bạn có thể tìm thấy số cam kết của mình trên đầu bị tách rời bởi 'git rev-parse HEAD' – KOGI

55

Bạn có thể làm một cái gì đó như thế này.

# Create temporary branch for your detached head 
git branch tmp 

# Go to master 
git checkout master 

# Merge in commits from previously detached head 
git merge tmp 

# Delete temproary branch 
git branch -d tmp 

Thậm chí đơn giản sẽ là

git checkout master 
git merge [email protected]{1} 

nhưng điều này có nguy cơ nhẹ rằng nếu bạn làm lỗi nó có thể khó khăn hơn một chút để khôi phục lại các cam kết thực hiện trên đầu tách ra.

+1

Tôi biết đây là năm sau, nhưng cảm ơn câu trả lời này. Tôi đã không xem xét bản thân mình thực hiện tìm kiếm với câu trả lời được chấp nhận ở đây bởi vì tôi không muốn để lại xung quanh một chi nhánh tạm thời và câu trả lời này có lệnh để xóa nó. –

+7

Nếu bạn quyết định sử dụng lệnh 'git merge HEAD @ {1}', bạn có thể đảm bảo rằng đó là lệnh bạn muốn sử dụng bằng cách sử dụng 'git reflog' –

+2

Có thể hợp nhất HEAD @ {1} đã cứu mạng tôi kể từ khi tôi đã kiểm tra chủ một cách ưu tiên. – juil

1

Tôi cũng đã sáng lập một bài viết trong đó nó được giải thích cách xử lý. Tôi thêm nó bởi vì nó là một chút differet từ những gì đã được đề xuất. Nhưng tôi nghĩ rằng tất cả các đề xuất có giá trị

http://edspencer.net/2009/10/git-what-to-do-if-you-commit-to-no-branch.html

Sau đó tôi sẽ chấp nhận câu trả lời đầu tiên làm tốt một

+0

Nếu câu trả lời của riêng bạn là hữu ích nhất thì bạn nên chấp nhận câu trả lời của riêng bạn. –

+0

Tôi hiểu, nhưng tôi nghĩ rằng phản hồi tôi chấp nhận dễ dàng hơn, hoặc ít nhất là dễ bị lỗi vì không cần sử dụng số cam kết – benzen

7

Đây là những gì tôi đã làm:

Về cơ bản, suy nghĩ của detached HEAD như một chi nhánh mới, không có tên. Bạn có thể cam kết vào nhánh này giống như bất kỳ chi nhánh nào khác. Một khi bạn đã thực hiện cam kết, bạn muốn đẩy nó vào điều khiển từ xa.

Vì vậy, điều đầu tiên bạn cần làm là cung cấp cho tên này detached HEAD. Bạn có thể dễ dàng làm điều đó như thế, trong khi được vào detached HEAD này:

git checkout -b some-new-name 

Bây giờ bạn có thể đẩy nó từ xa giống như bất kỳ chi nhánh khác.

Trong trường hợp của tôi, tôi cũng muốn tua nhanh nhánh này để làm chủ cùng với các cam kết mà tôi đã thực hiện trong detached HEAD (hiện tại some-new-branch).Tất cả tôi đã làm là

git checkout master 

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch 

git merge master // This added current state of master to my changes

Tất nhiên, tôi sáp nhập nó sau này để master.

Đó là về nó.

0

Có lẽ không phải giải pháp tốt nhất, (sẽ viết lại lịch sử) nhưng bạn cũng có thể làm git reset --hard <hash of detached head commit>.

2

Trong trường hợp HEAD bị tách rời, các cam kết hoạt động như bình thường, ngoại trừ không có chi nhánh được đặt tên được cập nhật. Để có được nhánh master được cập nhật với các thay đổi đã cam kết của bạn, hãy tạo nhánh tạm thời nơi bạn đang ở (nhánh này sẽ có tất cả các thay đổi đã thực hiện trong HEAD tách rời), sau đó chuyển sang nhánh chính và kết hợp nhánh tạm thời với bậc thầy.

git branch temp 
git checkout master 
git merge temp 
Các vấn đề liên quan