2013-05-08 23 views
9

Phiên bản ngắn của câu hỏi này là: làm thế nào tôi có thể bật stash git mà không kích hoạt tự động hợp nhất?làm thế nào để pop stit git mà không kích hoạt một auto-merge


Bây giờ cho các phiên bản còn ...

xem xét ví dụ đồ chơi sau đây của một thay thế cho git stash ... + git pull ... + git pop.

Đầu tiên, git status cho thấy rằng sửa đổi duy nhất trong thư mục làm việc là một số tệp được theo dõi foo.

# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: foo 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

Bây giờ, để thiết lập lại các thư mục làm việc đến một nhà nước trong sạch, như một điều kiện tiên quyết cho việc chạy git pull, tôi tạm thời đổi tên các tập tin được sửa đổi foo (đối với một số tên untracked), và khôi phục lại phiên bản của foo trong HEAD ...

% mv foo foo.$(date +%Y%m%dT%H%M%S) 
% git checkout foo 
% git status 
# On branch master 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
# foo.20130508T110014 
nothing added to commit but untracked files present (use "git add" to track) 

OK, bây giờ tôi chạy git pull, trong đó, vì lợi ích của ví dụ này, chúng ta có thể giả định là một nhanh về phía trước:

% git pull 

Cuối cùng, tôi khôi phục tạm thời được đổi tên foo.

% mv foo.20130508T110014 foo 

... và tôi trở lại

% git status 
# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: foo 
# 

Đây là "tương đương với đạo đức" của một git stash save + git pull + git stash pop, TRỪ rằng trước đây, chứ không phải sau này, là miễn dịch với "hợp nhất mâu thuẫn", như thế này một:

% git stash save 'WIP' 
% git pull 
% git stash pop 
Auto-merging foo 
CONFLICT (content): Merge conflict in foo 

Làm thế nào tôi có thể nhân rộng chuỗi rename-checkout-pull-rename trên sử dụng git stash save + ... + git stash pop, mà không cần kích hoạt tính năng tự động hợp nhất?

CHỈNH SỬA: Ngẫu nhiên, quy trình rename-checkout-...-rename thể hiện chặt chẽ hơn những gì tôi mong đợi từ lệnh gọi là stash. IOW: lưu trạng thái của thư mục làm việc của tôi ngay bây giờ, và thay thế nó sau này. Không có "hợp nhất" trong ảnh này.

+3

Nó không phải là tương đương đạo đức. Nếu bạn 'stash pop', các thay đổi sẽ được hợp nhất. Nếu bạn 'mv' tập tin của bạn trở lại, bất kỳ thay đổi nào đã xảy ra trong kho gốc sẽ bị mất và bị ghi đè bởi phiên bản tệp của bạn. – knittl

+0

Tôi không biết tại sao bạn đang đổi tên người nộp đơn và tất cả những người thấy câu trả lời của tôi ở đây http://stackoverflow.com/questions/16180916/git-three-different-repositories-with-common-files/16181046#16181046 hy vọng nó sẽ giúp – uday

+0

@ uDaY: Tôi không thể tìm thấy cách tránh tự động hợp nhất từ ​​câu trả lời đó. – kjo

Trả lời

3

Tôi muộn màng nhận ra rằng git đã cung cấp giải pháp cực kỳ đơn giản cho vấn đề thúc đẩy câu hỏi này (cụ thể là việc hợp nhất tự động với khả năng đặt kho lưu trữ ở trạng thái "chưa được kết nối").

Tất cả đều cần phải làm là sử dụng

git stash branch <branchname> [<stash>] 

thay vì git stash pop (hoặc git stash apply).

Điều này sẽ làm nổi bật theo cách được đảm bảo không bị xung đột. Easy-peasy-lemon-squeezy.

+0

Nhánh kết quả cũng không có bất kỳ cam kết được kéo nào trên đó. – jthill

+1

@ jthill: thực sự. Với một số trở ngại bây giờ tôi thấy rằng ở gốc của câu hỏi này là một sự hiểu biết ngây thơ về chức năng 'git stash' như một cách để" bỏ công việc của tôi, làm điều gì đó khác, và * quay lại ngay * nơi tôi đang ở. " Bức ảnh ngây thơ này đã phá vỡ khi phát hiện ra rằng, ví dụ, một 'git pull' sau khi 'get stash' có thể làm cho nó không thể" quay lại ngay "đến nơi tôi đã có một' git pop' đơn giản: có thể có mâu thuẫn với giải quyết. Vì vậy, tôi đã đúc về một cách để "quay lại ngay". Sau đó tôi nhận ra rằng cách đơn giản nhất để đạt được điều này là tạo ra một chi nhánh an toàn, ... – kjo

+0

... không có xung đột tại chỗ để bật stash. Đó là khi khám phá ý tưởng này mà tôi phát hiện ra rằng 'git' đã có tính năng này. Tôi nghĩ rằng tôi đã bỏ lỡ nó trước đó bởi vì tôi đã không hiểu 'git' chi nhánh rất tốt được nêu ra, và không quá thoải mái với họ. (Tôi vẫn không hiểu toàn bộ chi nhánh, nhưng tôi nghĩ bây giờ tôi đã hiểu rõ hơn họ rồi!) – kjo

1

OK, sau khi chạy vào một cái gì đó như thế này:

% git stash pop 
Auto-merging foo 
CONFLICT (content): Merge conflict in foo 
Auto-merging bar 
CONFLICT (content): Merge conflict in bar 
Auto-merging baz 
CONFLICT (content): Merge conflict in baz 
... 

# $#@?!?!%$!*@#... 

... là giải pháp tốt nhất mà tôi đã quản lý để đưa ra là để đáp ứng với điều này:

% git checkout --theirs $(git diff --name-only --diff-filter=U) 
% git reset 
% git stash drop 

(Dựa trên this answer.)

+1

Tại sao ngay cả bận tâm với stash tại thời điểm đó? Bạn chỉ cần bỏ tất cả các thay đổi của mình. –

+0

Không, tôi không. Tôi đã thử nghiệm nó. Ở trên là tốt. – kjo

+0

Xin lỗi, bằng "của bạn" tôi có nghĩa là các thay đổi từ máy chủ, chứ không phải các thay đổi được lưu trữ của bạn. Đó là từ ngữ kém. –

3

stash hợp nhất, đó chỉ là cách hoạt động.

Bạn có thể đạt được kết quả không hợp nhất với số write-treeread-treecheckout-index. Here's a worked example for doing this to achieve a pristine test environment.

Để chỉ brute-force stash không hợp nhất được áp dụng, bạn có thể, ví dụ:

git read-tree stash^{tree} 
git checkout-index -af 
+0

Cảm ơn, mặc dù tôi thú nhận 'cái đang git' trong ví dụ có nhiều vài dặm trên đầu tôi ... Đó chắc chắn không phải là rõ ràng với tôi rằng đó là vượt trội so với các giải pháp 3 dòng tôi đã đăng (trong đó, phải thừa nhận, là một hack). – kjo

+0

Nó không rõ ràng với tôi, hoặc là - làm việc hợp nhất throwaway sau đó undoing thiệt hại có một lợi thế thực sự trong sự quen thuộc, học cách sử dụng cây đọc và viết-cây và thanh toán chỉ số có riêng của mình. Những gì tôi liên kết là cho một tình huống khác nhau, thích ứng với nó ở đây sẽ tạo ra một chuỗi đơn giản hơn. Về cơ bản tôi chỉ để lại mẩu bánh mì, tôi đã tìm thấy học các lệnh lowlevel để được khen thưởng và đáng ngạc nhiên dễ dàng. git, nó chỉ ra, _very_ đơn giản ở cốt lõi của nó, nhưng nhận được vào công cụ đó là một chút của một hương vị có được. – jthill

+0

Tôi ở bên bạn: Tôi là tất cả để đi thẳng cho hệ thống ống nước, nhưng git-fu của tôi chưa có ... Cách tiếp cận 'git checkout ...' chỉ là * hơi * ít khó hiểu với tôi ở chốc lát. AFAICT, điểm khác biệt duy nhất giữa hai cách tiếp cận là với cách tiếp cận 'git checkout ...' 'ORIG_HEAD' kết thúc trỏ tới' HEAD ~ ', trong khi với cách tiếp cận của bạn, nó kết thúc bằng việc trỏ đến' HEAD'. – kjo

2

Thực tế bạn đang thấy xung đột hợp nhất có nghĩa là đã có thay đổi trong tệp foo mà bạn đã lấy từ máy chủ. Vì vậy, sao chép tập tin của bạn hơn và di chuyển trở lại sẽ hoàn toàn nuke tất cả các thay đổi từ repo trong tập tin foo. Nếu bạn cam kết, người khác cam kết thay đổi cho foo sẽ ghét bạn.

Câu trả lời cho câu hỏi của bạn phụ thuộc vào những gì bạn đang cố gắng hoàn thành. Bạn đang cố gắng xem những thay đổi trên máy chủ được so sánh với mã của bạn? Bạn đang cố gắng tránh đối phó với mã của người khác cho đến khi bạn làm xong?

Nếu bạn chỉ muốn xem thay đổi của chi nhánh là gì, bạn có thể sử dụng git fetch thay vì git pull và so sánh mã hiện tại của bạn với điều đó. Hoặc, nếu bạn không muốn hợp nhất các thay đổi của mình ngay bây giờ, hãy xem xét làm việc trong một nhánh riêng biệt hoặc không kéo cho đến khi bạn sẵn sàng hợp nhất.

+0

Tôi không hiểu câu hỏi của bạn, vì tôi đã đăng một giải pháp đánh vần một cách rõ ràng những gì tôi đã "cố gắng hoàn thành". – kjo

+0

@kjo Lý do tôi không chắc chắn những gì bạn đang cố gắng hoàn thành là quá trình bạn mô tả (cả trong bài đăng gốc và trong giải pháp của bạn) sẽ khiến bạn hoàn tác các thay đổi khác trong tệp của mình mà không cần xem xét chúng. Mà, nếu bạn đã hoàn toàn nhận thức được quá trình của bạn có thể là ok. Nhưng mô tả của bạn nói rằng quá trình của bạn là "tương đương đạo đức" của lệnh stash cho thấy rằng bạn không hoàn toàn nhận thức được thiệt hại mà quá trình của bạn sẽ gây ra. –

+0

@kjo Có thể có bất kỳ thay đổi nào trong tệp trên máy chủ từ phiên bản của bạn. Nếu một trong những thay đổi duy nhất xung đột, thay vì giải quyết xung đột, bạn sẽ loại bỏ tất cả thay đổi trong tệp có lợi cho phiên bản tệp có khả năng lỗi thời của bạn. Điều này có thể gây ra rất nhiều cơn đau đầu xuống đường như những sửa chữa mà mọi người nghĩ đã được thực hiện, đột nhiên, không phải trong phiên bản mới nhất. –

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