2.6k

Làm cách nào tôi chỉ có thể bỏ một trong nhiều tệp đã thay đổi trên nhánh của mình?

|
  • 95

    Tôi không nghĩ câu trả lời được chấp nhận của @ bukzor là câu trả lời đúng cho câu hỏi khi được hỏi. git stash --keep-indexkhông giữ chỉ mục, nhưng nó làm hỏng mọi thứ - cả trong chỉ mục và ngoài.

    – Lê Trúc Quỳnh 19:25:16 17/03/2013
  • @Antonio Dường như với tôi, tiền thưởng của bạn thực sự nên là một câu hỏi riêng biệt, vì câu hỏi ban đầu không liên quan gì đến TortoiseGit.

    – Lê Hùng Sơn 03:55:19 15/04/2015
  • 1

    @JesusFreke Yep, đưa ra kết quả tôi có thể bỏ qua 50 rep :) Chỉ là đây là câu hỏi mà bạn được chuyển hướng đến nếu bạn cố gắng tìm kiếm "stash tortoisegit một phần". Tortoisegit dường như không phải là một chủ đề phổ biến ở đây stackoverflow.com/questions/tagged/tortoisegit

    – Trịnh Mộng Vân 13:40:44 15/04/2015
  • 5

    >>>>>>>>> git diff -- *filename* > ~/patchsau đó git checkout -- *filename*và sau này bạn có thể áp dụng lại bản vá vớigit apply ~/patch

    – Trịnh Quốc Hiền 02:08:53 23/12/2015
  • 31

    Hầu hết các câu trả lời hiện có dưới đây đã lỗi thời. Kể từ Git 2.13 (quý 2 năm 2017), nó được hỗ trợ git stash push [--] [<pathspec>...].

    – Đặng Tuấn Hải 13:23:39 15/08/2017
1.2k

Cập nhật câu trả lời sau là cho git trước git 2.13. Đối với git 2.13 trở lên, hãy kiểm tra Làm thế nào tôi có thể git stash một tệp cụ thể?

Cảnh báo

Như đã lưu ý trong các bình luận, điều này đặt mọi thứ vào stash, cả được dàn dựng và không được dàn dựng. --Keep-index chỉ để lại chỉ mục một mình sau khi stash được thực hiện. Điều này có thể gây ra xung đột hợp nhất khi bạn bật stash sau này.


Điều này sẽ bỏ qua mọi thứ mà bạn chưa thêm trước đó. Chỉ cần git addnhững thứ bạn muốn giữ, sau đó chạy nó.

git stash --keep-index

Ví dụ: nếu bạn muốn tách một cam kết cũ thành nhiều thay đổi, bạn có thể sử dụng quy trình này:

  1. git rebase -i <last good commit>
  2. Đánh dấu một số thay đổi là edit.
  3. git reset HEAD^
  4. git add <files you want to keep in this change>
  5. git stash --keep-index
  6. Sửa chữa mọi thứ khi cần thiết. Đừng quên git addbất kỳ thay đổi.
  7. git commit
  8. git stash pop
  9. Lặp lại, từ số 5, khi cần thiết.
  10. git rebase --continue
|
  • 1

    Tôi thấy cách tiếp cận này đơn giản hơn nhiều: stackoverflow.com/a/5506483/457268

    – Trịnh Duy Uyên 14:52:54 03/09/2012
  • 1

    Tôi không chắc tại sao điều này đang được nâng cấp. Mọi người phải có một kỳ vọng khác với tôi. Bài viết gốc đang hỏi "làm thế nào để tôi bỏ qua một phần của những thay đổi không được cam kết?" Khi tôi sử dụng git stash save -k, có, chỉ mục (màu xanh lá cây git stat) được giữ nguyên, nhưng toàn bộ thay đổi (cả màu xanh lá cây và màu đỏ) đi vào ngăn chứa. Điều này vi phạm yêu cầu của OP, "chỉ thực hiện một số thay đổi". Tôi muốn bỏ bớt một số màu đỏ (để sử dụng trong tương lai).

    – Ngô Anh Thy 17:01:18 07/12/2012
  • 1

    Nếu bạn quan tâm hơn đến câu trả lời cho câu hỏi được đặt ra bởi @Pistos (như tôi), thì hãy xem tại đây: stackoverflow.com/questions/5506339/

    – Lý Vân Mi 19:22:40 17/03/2013
  • 1

    @Raman: Tuyệt vời! git stash -pchính xác là những gì tôi đang tìm kiếm. Tôi tự hỏi nếu chuyển đổi này chỉ được thêm gần đây.

    – Phạm Nhất Tiến 21:47:27 09/04/2013
  • 1

    CẢNH BÁO: git stash --keep-indexbị hỏng. Nếu bạn thực hiện nhiều thay đổi hơn, sau đó cố gắng để git stash popsau đó bạn nhận được xung đột hợp nhất vì ngăn chứa bao gồm các tệp đã thay đổi mà bạn giữ, không chỉ các tệp bạn không giữ. Ví dụ: Tôi thay đổi tệp A và B, sau đó bỏ B, vì tôi muốn kiểm tra các thay đổi trong A; Tôi tìm thấy một vấn đề với A mà sau đó tôi sửa chữa; Tôi cam kết A; Bây giờ tôi không thể hủy bỏ vì một phiên bản cũ của A không có lý do chính đáng gây ra xung đột hợp nhất. Trong thực tế A và B có thể là nhiều tệp, thậm chí có thể là hình ảnh nhị phân hoặc thứ gì đó, vì vậy về cơ bản tôi phải từ bỏ và mất B.

    – Dương Hồng Ðiệp 17:28:16 26/02/2014
2.8k

Bạn cũng có thể sử dụng git stash save -p "my commit message". Bằng cách này, bạn có thể chọn những người hunk nên được thêm vào stash, toàn bộ tập tin cũng có thể được chọn.

Bạn sẽ được nhắc nhở với một vài hành động cho mỗi hunk:

   y - stash this hunk
   n - do not stash this hunk
   q - quit; do not stash this hunk or any of the remaining ones
   a - stash this hunk and all later hunks in the file
   d - do not stash this hunk or any of the later hunks in the file
   g - select a hunk to go to
   / - search for a hunk matching the given regex
   j - leave this hunk undecided, see next undecided hunk
   J - leave this hunk undecided, see next hunk
   k - leave this hunk undecided, see previous undecided hunk
   K - leave this hunk undecided, see previous hunk
   s - split the current hunk into smaller hunks
   e - manually edit the current hunk
   ? - print help
|
332

Vì git về cơ bản là quản lý tất cả nội dung và chỉ mục của kho lưu trữ (chứ không phải một hoặc một số tệp) git stash, nên không có gì đáng ngạc nhiên,với tất cả các thư mục làm việc.

Trên thực tế, kể từ Git 2.13 (quý 2 năm 2017), bạn có thể bỏ các tệp riêng lẻ, với git stash push:

git stash push [--] [<pathspec>...]

Khi pathspecđược trao cho ' git stash push', stash mới chỉ ghi lại các trạng thái đã sửa đổi cho các tệp khớp với đường dẫn

Xem " Stash thay đổi cho các tập tin cụ thể " để biết thêm.

Các trường hợp thử nghiệm là tự giải thích:

test_expect_success 'stash with multiple pathspec arguments' '
    >foo &&
    >bar &&
    >extra &&
    git add foo bar extra &&

    git stash push -- foo bar &&   

    test_path_is_missing bar &&
    test_path_is_missing foo &&
    test_path_is_file extra &&

    git stash pop &&
    test_path_is_file foo &&
    test_path_is_file bar &&
    test_path_is_file extra

Câu trả lời ban đầu (bên dưới, tháng 6 năm 2010) là về cách chọn thủ công những gì bạn muốn bỏ.

Bình luận của Casebash :

Điều này ( stash --patchgiải pháp ban đầu) là tốt, nhưng thường tôi đã sửa đổi rất nhiều tệp vì vậy sử dụng bản vá rất khó chịu

Câu trả lời của bukzor (được nâng cấp, tháng 11 năm 2011) cho thấy một giải pháp thiết thực hơn, dựa trên
git add+git stash --keep-index .
Đi xem và nâng cao câu trả lời của anh ấy, nên là câu trả lời chính thức (thay vì của tôi).

Về tùy chọn đó, chhh chỉ ra một quy trình công việc thay thế trong các bình luận:

bạn nên " git reset --soft" sau một cú ném như vậy để lấy lại dàn dựng rõ ràng của mình:
Để trở về trạng thái ban đầu - đó là một khu vực dàn dựng rõ ràng và chỉ với một số sửa đổi không được chọn, người ta có thể nhẹ nhàng đặt lại chỉ mục để nhận (mà không cần cam kết bất cứ điều gì như bạn - bukzor - đã làm).


(Câu trả lời gốc tháng 6 năm 2010: stash thủ công)

Tuy nhiên, git stash save --patchcó thể cho phép bạn đạt được một phần của bạn sau:

Với --patch, bạn có thể tương tác chọn những người đi săn trong khoảng khác nhau giữa CHÍNH và cây làm việc được cất.
Mục stash được xây dựng sao cho trạng thái chỉ mục của nó giống với trạng thái chỉ mục của kho lưu trữ của bạn và bảng công việc của nó chỉ chứa các thay đổi bạn đã chọn tương tác. Các thay đổi đã chọn sau đó được khôi phục từ bàn làm việc của bạn.

Tuy nhiên, điều đó sẽ lưu chỉ mục đầy đủ (có thể không phải là điều bạn muốn vì nó có thể bao gồm các tệp khác đã được lập chỉ mục) và một bàn làm việc một phần (có thể trông giống như tệp bạn muốn bỏ).

git stash --patch --no-keep-index

có thể là một phù hợp tốt hơn.


Nếu --patchkhông hoạt động, một quy trình thủ công có thể:

Đối với một hoặc một số tệp, một giải pháp trung gian sẽ là:

  • sao chép chúng bên ngoài repo Git
    (Trên thực tế, eleotlecram đề xuất một giải pháp thay thế thú vị )
  • git stash
  • sao chép lại
  • git stash # lần này, chỉ các tệp bạn muốn được lưu vào
  • git stash pop stash@{1} # áp dụng lại tất cả các sửa đổi tệp của bạn
  • git checkout -- afile # đặt lại tệp về nội dung CHÍNH, trước khi sửa đổi cục bộ

Khi kết thúc quá trình khá rườm rà đó, bạn sẽ chỉ có một hoặc một vài tệp được lưu trữ.

|
  • 1

    Điều này thật tuyệt, nhưng tôi thường sửa đổi rất nhiều tệp vì vậy sử dụng bản vá rất khó chịu

    – Trịnh Duy Uyên 02:03:09 16/11/2011
  • 1

    @VonC: Đó là phong cách tốt khi chỉ có một câu trả lời cho mỗi câu trả lời. Ngoài ra, sao chép câu trả lời của người khác vào câu trả lời của bạn là cách cư xử tệ.

    – Ngô Anh Thy 17:05:07 12/12/2011
  • 1

    @bukzor: Tôi xin lỗi nếu câu trả lời được chỉnh sửa của tôi có vẻ không đúng. Mục đích duy nhất của tôi là cung cấp cho câu trả lời của bạn rõ hơn. Tôi đã chỉnh sửa lại bài viết của mình, để làm cho ý định đó rõ ràng hơn.

    – Lý Vân Mi 18:28:43 12/12/2011
  • 1

    @Kal: đúng, stackoverflow.com/a/13941132/6309 gợi ý một git reset(hỗn hợp)

    – Phạm Nhất Tiến 07:43:24 22/03/2013
  • 1

    git is fundamentally about managing a all repository content and index and not one or several files- đó là việc thực hiện làm lu mờ vấn đề đang được giải quyết; đó là một lời giải thích, nhưng không phải là một lời biện minh. Bất kỳ hệ thống kiểm soát nguồn IS nào về "quản lý một số tệp". Chỉ cần nhìn những gì bình luận được nâng cao nhất.

    – Dương Hồng Ðiệp 11:09:26 23/12/2015
81

Khi git stash -p(hoặc git add -pvới stash --keep-index) sẽ là quá cồng kềnh, tôi tìm thấy nó dễ dàng hơn để sử dụng diff, checkoutapply:

Để "stash" một tệp / thư mục cụ thể:

git diff path/to/dir > stashed.diff
git checkout path/to/dir

Sau đó sau đó

git apply stashed.diff
|
  • 1

    Thay thế thú vị cho git add -ptôi đã đề cập trong câu trả lời của riêng tôi ở trên. +1.

    – Trịnh Duy Uyên 13:56:38 12/02/2014
  • 1

    Lưu ý rằng nếu bạn có tệp nhị phân (như PNG) thì chúng sẽ không được xuất ra tệp khác. Vì vậy, đây không phải là một giải pháp 100%.

    – Ngô Anh Thy 14:15:25 13/03/2014
  • 1

    @RobertDailey: Đó là một điểm thú vị đối với tôi, git diff > file.diffgit applycũng là công cụ stash một phần thông thường của tôi. Tôi có thể phải xem xét chuyển sang git stash -pcho những thay đổi lớn hơn.

    – Lý Vân Mi 19:38:08 20/06/2014
  • 1

    @thekingoftruth Dưới đây là bí danh tôi sử dụng để tạo ra các file vá, và nó không binaries hỗ trợ: patch = log --pretty=email --patch-with-stat --reverse --full-index --binary. Lưu ý, tuy nhiên, điều này đòi hỏi những thay đổi của bạn để bản vá được cam kết.

    – Phạm Nhất Tiến 14:30:19 23/06/2014
  • 1

    Điều này đã không hoạt động sạch đối với tôi nếu tập tin để stash là một cái gì đó như ../../foo/bar.txt. Bản vá tạo ra OK, nhưng sau đó tôi cần di chuyển đến kho lưu trữ gốc để lấy bản vá để áp dụng. Vì vậy, nếu bạn gặp rắc rối với điều này - chỉ cần đảm bảo rằng bạn đang thực hiện nó từ thư mục gốc của kho lưu trữ.

    – Dương Hồng Ðiệp 06:23:57 03/06/2016
64

Sử dụng git stash push, như thế này:

git stash push [--] [<pathspec>...]

Ví dụ:

git stash push -- my/file.sh

Điều này có sẵn kể từ Git 2.13, được phát hành vào mùa xuân năm 2017.

|
45

Giả sử bạn có 3 tệp

a.rb
b.rb
c.rb

và bạn chỉ muốn stash b.rb và c.rb chứ không phải a.rb

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

# commit the files temporarily you don't want to stash
git add a.rb
git commit -m "temp" 

# then stash the other files
git stash save "stash message"

# then undo the previous temp commit
git reset --soft HEAD^
git reset

Và bạn đã hoàn thành! HTH.

|
27

Một cách khác để làm điều này:

# Save everything
git stash 

# Re-apply everything, but keep the stash
git stash apply

git checkout <"files you don't want in your stash">

# Save only the things you wanted saved
git stash

# Re-apply the original state and drop it from your stash
git stash apply stash@{1}
git stash drop stash@{1}

git checkout <"files you put in your stash">

Tôi đã nghĩ ra điều này sau khi tôi (một lần nữa) đến trang này và không thích hai câu trả lời đầu tiên (câu trả lời đầu tiên không trả lời câu hỏi và tôi không thích làm việc với -pchế độ tương tác).

Ý tưởng này giống như những gì @VonC đã đề xuất khi sử dụng các tệp bên ngoài kho lưu trữ, bạn lưu các thay đổi bạn muốn ở đâu đó, xóa các thay đổi bạn không muốn trong ngăn chứa của mình và sau đó áp dụng lại các thay đổi bạn đã thực hiện. Tuy nhiên, tôi đã sử dụng git stash như là "một nơi nào đó" (và kết quả là, có thêm một bước nữa: loại bỏ các cahnges bạn đặt trong stash, vì bạn cũng di chuyển chúng ra khỏi đường đi).

|
  • 1

    tôi thích cách tiếp cận này nhất. Nó cung cấp một quy trình làm việc dễ dàng trong tortoisegit chỉ bằng các lệnh stash và Revert.

    – Dương Thảo Hương 10:38:05 01/02/2016
  • 1

    Đề cập đến câu trả lời về SO sử dụng các vị trí là không nên. Vị trí thay đổi khi xếp hạng thay đổi.

    – Tạ Quốc Khánh 15:37:53 01/06/2016
  • 1

    @BryanAsh Chà, nó không giống như vấn đề ở đây. Tôi đang đưa ra một giai thoại hơn là thực sự đề cập đến các câu trả lời khác. Thông điệp là tôi không thích câu trả lời mà cộng đồng thích và không phải những câu trả lời này thực sự chứa gì. Bên cạnh đó, khoảng cách 900 phiếu giữa câu trả lời thứ hai và thứ ba khiến điều này khó có thể thay đổi trong tương lai gần và nếu nó cần thay đổi, tôi luôn có thể chỉnh sửa nó để nói "từ đầu đến câu trả lời". Thực sự, tôi không thấy đây là vấn đề gì trong tình huống này.

    – Tạ Nghĩa Hiếu 16:44:04 01/06/2016
23

Cập nhật (14/2/2015) - Tôi đã viết lại tập lệnh một chút, để xử lý tốt hơn các trường hợp xung đột, giờ đây sẽ được trình bày dưới dạng xung đột chưa được xử lý thay vì các tệp .rej.


Tôi thường thấy trực quan hơn khi thực hiện nghịch đảo phương pháp của @ bukzor. Đó là, để tạo ra một số thay đổi, và sau đó chỉ thực hiện những thay đổi theo giai đoạn đó.

Thật không may, git không cung cấp một git stash --only-index hoặc tương tự, vì vậy tôi đã tạo ra một kịch bản để làm điều này.

#!/bin/sh

# first, go to the root of the git repo
cd `git rev-parse --show-toplevel`

# create a commit with only the stuff in staging
INDEXTREE=`git write-tree`
INDEXCOMMIT=`echo "" | git commit-tree $INDEXTREE -p HEAD`

# create a child commit with the changes in the working tree
git add -A
WORKINGTREE=`git write-tree`
WORKINGCOMMIT=`echo "" | git commit-tree $WORKINGTREE -p $INDEXCOMMIT`

# get back to a clean state with no changes, staged or otherwise
git reset -q --hard

# Cherry-pick the index changes back to the index, and stash.
# This cherry-pick is guaranteed to succeed
git cherry-pick -n $INDEXCOMMIT
git stash

# Now cherry-pick the working tree changes. This cherry-pick may fail
# due to conflicts
git cherry-pick -n $WORKINGCOMMIT

CONFLICTS=`git ls-files -u`
if test -z "$CONFLICTS"; then
    # If there are no conflicts, it's safe to reset, so that
    # any previously unstaged changes remain unstaged
    #
    # However, if there are conflicts, then we don't want to reset the files
    # and lose the merge/conflict info.
    git reset -q
fi

Bạn có thể lưu tập lệnh trên dưới dạng git-stash-indexmột nơi nào đó trên đường dẫn của mình và sau đó có thể gọi nó dưới dạng git stash-index

# <hack hack hack>
git add <files that you want to stash>
git stash-index

Bây giờ, stash chứa một mục mới chỉ chứa các thay đổi bạn đã dàn dựng và cây làm việc của bạn vẫn chứa bất kỳ thay đổi chưa được phân loại nào.

Trong một số trường hợp, thay đổi cây làm việc có thể phụ thuộc vào thay đổi chỉ mục, vì vậy khi bạn thay đổi chỉ mục, thay đổi cây làm việc có xung đột. Trong trường hợp này, bạn sẽ nhận được các xung đột chưa được xử lý thông thường mà bạn có thể giải quyết bằng git merge / git mergetool / vv.

|
  • 1

    Đề nghị pushdthay vì cdpopdở cuối tập lệnh để nếu tập lệnh thành công, người dùng sẽ kết thúc trong cùng thư mục như trước khi chạy tập lệnh.

    – Dương Thảo Hương 13:31:38 23/03/2015
  • 1

    @Nate: theo như tôi biết, nó chỉ nên thay đổi thư mục cho người dùng nếu họ có nguồn gốc tập lệnh. Nếu bạn chạy tập lệnh một cách bình thường (~ / bin / git-stash-index) hoặc thông qua git (git stash-index), nó sẽ được chạy trong một phiên cuối riêng biệt và mọi thay đổi thư mục làm việc trong phiên đó sẽ không ảnh hưởng đến thư mục làm việc trong phiên cuối của người dùng. Bạn có biết về một trường hợp sử dụng phổ biến khi điều này không đúng? (ngoài việc tìm nguồn cung cấp kịch bản mà tôi không coi là "phổ biến")

    – Tạ Quốc Khánh 17:48:18 23/03/2015
19

Vì việc tạo các nhánh trong Git là không đáng kể, bạn chỉ có thể tạo một nhánh tạm thời và kiểm tra các tệp riêng lẻ vào nó.

|
  • 1

    Bạn không thể tạo một nhánh với các chỉnh sửa chưa được chỉnh sửa. Bạn có thể dễ dàng di chuyển tất cả các chỉnh sửa sang một nhánh mới (stash / stash pop) nhưng sau đó bạn quay lại quảng trường: làm thế nào để bạn kiểm tra chi nhánh của mình chỉ với một số chỉnh sửa đó mà không mất các chỉnh sửa khác?

    – Phạm Hà Khuê 16:01:55 07/12/2011
  • 1

    Tôi chỉ tạo một nhánh với các chỉnh sửa chưa được chỉnh sửa.

    – Phạm Thành Trung 11:00:24 15/12/2011
  • 1

    Bạn không thể chuyển chi nhánh nếu bạn có thay đổi cục bộ. Tuy nhiên, bạn có thể tạo một nhánh mới và thêm / chọn lọc các tệp, sau đó tạo một nhánh khác và thực hiện đệ quy tương tự ... sau đó kiểm tra nhánh ban đầu và chọn lọc hợp nhất trở lại. Tôi vừa thực hiện. Nó thực sự có vẻ là cách tự nhiên để làm mọi thứ, vì về cơ bản bạn đang tạo các nhánh tính năng.

    – Lý Hồng Tâm 07:51:50 17/02/2012
  • 1

    @iain bạn có thể chuyển đổi chi nhánh nếu bạn có thay đổi cục bộ, miễn là chúng không yêu cầu hợp nhất. Xem ví dụ Gist . Điều này đúng với Git v2.7.0 ít nhất.

    – Đỗ Bảo Giang 16:54:33 18/02/2016
11

Chỉ trong trường hợp bạn thực sự muốn loại bỏ thay đổi bất cứ khi nào bạn sử dụng git stash(và không thực sự sử dụng git stash để tạm thời xóa nó), trong trường hợp đó bạn có thể sử dụng

git checkout -- <file>

[ LƯU Ý ]

Đó git stashchỉ là một sự thay thế nhanh chóng và đơn giản để phân nhánh và làm công cụ.

|
11

Lưu mã sau vào một tệp, ví dụ, được đặt tên stash. Cách sử dụng là stash <filename_regex>. Đối số là biểu thức chính quy cho đường dẫn đầy đủ của tệp. Ví dụ: để bỏ a / b / c.txt, stash a/b/c.txthoặc stash .*/c.txt, v.v.

$ chmod +x stash
$ stash .*.xml
$ stash xyz.xml

Mã để sao chép vào tập tin:

#! /usr/bin/expect --
log_user 0
set filename_regexp [lindex $argv 0]

spawn git stash -p

for {} 1 {} {
  expect {
    -re "diff --git a/($filename_regexp) " {
      set filename $expect_out(1,string)
    }
    "diff --git a/" {
      set filename ""
    }
    "Stash this hunk " {
      if {$filename == ""} {
        send "n\n"
      } else {
        send "a\n"
        send_user "$filename\n"
      }
    }
    "Stash deletion " {
      send "n\n"
    }
    eof {
      exit
    }
  }
}
|
  • 1

    Phương pháp tuyệt vời. Tôi đã chọn đây là câu trả lời. Mẹo cho độc giả tương lai: bạn phải phù hợp trên đường dẫn đầy đủ. ví dụ: stash

    – Phạm Hà Khuê 03:13:13 21/10/2014
7

Điều này có thể được thực hiện dễ dàng trong 3 bước bằng SourceTree.

  1. Tạm thời cam kết mọi thứ bạn không muốn cất giấu.
  2. Git thêm mọi thứ khác, sau đó stash nó.
  3. Bật cam kết tạm thời của bạn bằng cách chạy thiết lập lại git, nhắm mục tiêu cam kết trước khi tạm thời.

Tất cả điều này có thể được thực hiện trong vài giây trong SourceTree, nơi bạn chỉ cần nhấp vào các tệp (hoặc thậm chí từng dòng riêng lẻ) mà bạn muốn thêm. Sau khi thêm, chỉ cần cam kết chúng với một cam kết tạm thời. Tiếp theo, nhấp vào hộp kiểm để thêm tất cả các thay đổi, sau đó nhấp vào stash để bỏ tất cả mọi thứ. Với các thay đổi được sắp xếp sẵn, hãy lướt qua danh sách cam kết của bạn và lưu ý hàm băm cho cam kết trước khi cam kết tạm thời của bạn, sau đó chạy 'git reset hash_b4_temp_commit', về cơ bản giống như "bật" cam kết bằng cách đặt lại chi nhánh của bạn vào cam kết ngay trước khi nó. Bây giờ, bạn chỉ còn lại những thứ bạn không muốn cất.

|
7

Đôi khi tôi đã thực hiện một thay đổi không liên quan đến chi nhánh của mình trước khi tôi cam kết và tôi muốn chuyển nó sang chi nhánh khác và cam kết riêng rẽ (như chủ). Tôi làm việc này:

git stash
git checkout master
git stash pop
git add <files that you want to commit>
git commit -m 'Minor feature'
git stash
git checkout topic1
git stash pop
...<resume work>...

Lưu ý đầu tiên stash& stash popcó thể được loại bỏ, bạn có thể thực hiện tất cả các thay đổi của mình cho masterchi nhánh khi bạn thanh toán, nhưng chỉ khi không có xung đột. Ngoài ra nếu bạn đang tạo một nhánh mới cho các thay đổi một phần, bạn sẽ cần stash.

Bạn có thể đơn giản hóa nó với giả định không có xung đột và không có chi nhánh mới:

git checkout master
git add <files that you want to commit>
git commit -m 'Minor feature'
git checkout topic1
...<resume work>...

Stash thậm chí không cần thiết ...

|
7

Vấn đề với giải pháp sao chép tệp 'trung gian' của VonC ra bên ngoài repo Git là bạn bị mất thông tin đường dẫn, điều này khiến việc sao chép một loạt các tệp trở lại sau đó có phần rắc rối.

Việc tìm kiếm sử dụng tar dễ dàng hơn (các công cụ tương tự có thể sẽ làm) thay vì sao chép:

  • tar cvf /tmp/stash.tar đường dẫn / đến / some / đường dẫn tệp / đến / some / other / file (... vv)
  • đường dẫn kiểm tra git / đến / some / đường dẫn tệp / đến / some / other / file
  • git stash
  • tar xvf /tmp/stash.tar
  • v.v. (xem gợi ý 'trung gian' của VonC)
|
6

Tôi sẽ sử dụng git stash save --patch. Tôi không thấy tính tương tác gây khó chịu vì có các tùy chọn trong đó để áp dụng thao tác mong muốn cho toàn bộ tệp.

|
  • 1

    Thật ngạc nhiên khi có rất ít sự ủng hộ cho câu trả lời này, đó là giải pháp tốt nhất mà không cần một bài luận.

    – Hoàng Nhật Huy 15:02:04 04/09/2017
  • 1

    Chắc chắn là câu trả lời tốt, git stash -pcho phép bạn nhanh chóng lấy toàn bộ tệp và thoát ra sau đó.

    – Hồ Ðăng An 13:17:34 07/12/2017

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.