Đưa các thay đổi không được cam kết tại Master sang một chi nhánh mới của Git


Câu trả lời:


151

Bạn chỉ có thể kiểm tra chi nhánh thử nghiệm và sau đó cam kết. Bạn không mất những thay đổi không được cam kết khi chuyển sang chi nhánh khác.

Giả sử bạn đang ở chi nhánh chính:

git checkout test
git add .
git add deletedFile1
git add deletedFile2
...
git commit -m "My Custom Message"

Tôi không thực sự chắc chắn về các tệp đã bị xóa, nhưng tôi đoán chúng không được bao gồm khi bạn sử dụng git add .


12
Đôi khi thanh toán sẽ thất bại vì những thay đổi của bạn xung đột với chi nhánh đó. Bạn có thể thử thanh toán -m để hợp nhất.
Jouni K. Seppänen

2
Tôi đã thử điều này nhưng tôi gặp một lỗi: lỗi: Thay đổi cục bộ của bạn đối với các tệp sau sẽ bị ghi đè khi thanh toán. Xin vui lòng, cam kết thay đổi của bạn hoặc bỏ qua chúng trước khi bạn có thể chuyển đổi chi nhánh.
ghi

Trong khi điều này sẽ hoạt động, câu trả lời cho biết sử dụng stash nên được ưu tiên, IMO. Có thể chỉ là sự lựa chọn cá nhân, nhưng đó là một quy trình làm việc sạch hơn, hợp lý và giới thiệu STASH là một lệnh hữu ích.
Patrick

Tùy chọn "-b" bị thiếu, vì tiêu đề cho thấy câu hỏi liên quan đến một nhánh "mới".
Guntram

195

Ngoài ra, bạn có thể tạo một nhánh mới và chuyển sang nó bằng cách thực hiện:

git checkout -b new_branch
git add .

Tôi sử dụng điều này mọi lúc vì tôi luôn quên bắt đầu một chi nhánh mới trước khi bắt đầu chỉnh sửa mã.


3
vấn đề tương tự như @jouni đã lưu ý cho câu trả lời khác - bạn có thể gặp khó khăn khi hợp nhất chi nhánh trở lại thành chủ nếu thay đổi bổ sung xung đột với thay đổi ban đầu. IMO chủ đề này trả lời câu hỏi tốt hơn: stackoverflow.com/questions/556923/ cấp
jpw

Tóm lại, ngọt ngào và yên tâm ... "Tôi sử dụng tất cả thời gian ..."
ΣοδεMεδις

1
Đừng quên thực hiện cam kết trong new_branch. Nếu bạn chuyển trở lại nhánh chính và hoàn nguyên các tệp đã thay đổi, bạn cũng sẽ mất chúng trong new_branch.
petrsyn

36

Tại sao không chỉ sử dụng git stash. Tôi nghĩ rằng nó trực quan hơn như sao chép và dán.

$ git branch
  develop
* master
  feature1
  TEST
$

Bạn có một số tệp trong nhánh hiện tại của bạn mà bạn muốn di chuyển.

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#      modified:   awesome.py
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#      modified:   linez.py
#
$
$ git stash
Saved working directory and index state \
  "WIP on master: 934beef added the index file"
HEAD is now at 934beef added the index file
(To restore them type "git stash apply")
$
$ git status
# On branch master
nothing to commit (working directory clean)
$
$
$ git stash list
stash@{0}: WIP on master: 934beef ...great changes
$

Di chuyển đến chi nhánh khác.

$ git checkout TEST

Và áp dụng

$ git stash apply
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#      modified:   awesome.py
#      modified:   linez.py
#

Tôi cũng thích git stashvì tôi sử dụng git flow, nó phàn nàn khi bạn muốn hoàn thành một nhánh tính năng trong khi vẫn có những thay đổi trong thư mục làm việc của bạn.

Giống như @Mike Bethany, điều này xảy ra với tôi mọi lúc vì tôi làm việc với một vấn đề mới trong khi quên tôi vẫn đang ở một chi nhánh khác. Vì vậy, bạn có thể giấu công việc của bạn, git flow feature finish...git stash applyđể mới git flow feature start ...chi nhánh.


2
git stashlà cách ưa thích của tôi để đối phó với những thay đổi không được cam kết. Đó chắc chắn là một phương pháp trực quan khi bạn nghĩ về nó như cắt và dán.
Matthew Mitchell

Đây có vẻ là một cách tiếp cận tốt với tôi. Nó làm việc mà không có vấn đề gì.
Yunus Nedim Mehel

Không biết bạn có thể làm điều này và nó hoạt động tốt. Cảm thấy trực quan hơn một chút so với các phương pháp khác.
glaucon

Tôi nghĩ rằng stashing nó là cách chuyên nghiệp hơn, thay vì sử dụng kiểm tra git và sau đó thêm. Tôi nghĩ rằng câu trả lời của bạn nên được hơn 100 phiếu.
Matrosov Alexander

1
@ Αrτhικgit stash --include-untracked
2Tải

5
git checkout TEST
git add file1 file2
git commit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.