นำการเปลี่ยนแปลงแบบไม่มีข้อผูกมัดที่ Master ไปยังสาขาใหม่โดย Git


คำตอบ:


151

คุณสามารถเช็คเอาต์ไปที่สาขาการทดสอบแล้วส่ง คุณจะไม่สูญเสียการเปลี่ยนแปลงที่ไม่ได้ตั้งใจเมื่อย้ายไปที่สาขาอื่น

หากว่าคุณอยู่ที่สาขาหลัก:

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

ฉันไม่แน่ใจเกี่ยวกับไฟล์ที่ถูกลบจริงๆ แต่ฉันเดาว่ามันจะไม่ถูกรวมเมื่อคุณใช้ git add .


12
บางครั้งการชำระเงินอาจล้มเหลวเนื่องจากการเปลี่ยนแปลงของคุณขัดแย้งกับสาขานั้น คุณสามารถลองเช็คเอาต์ -m เพื่อรวม
Jouni K. Seppänen

2
ฉันลองสิ่งนี้ แต่ฉันพบข้อผิดพลาด: ข้อผิดพลาด: การเปลี่ยนแปลงในท้องถิ่นของคุณสำหรับไฟล์ต่อไปนี้จะถูกเขียนทับโดยเช็คเอาต์ โปรดกระทำการเปลี่ยนแปลงของคุณหรือซ่อนไว้ก่อนที่จะเปลี่ยนสาขา
ishwr

ในขณะนี้จะใช้งานได้คำตอบที่กล่าวว่าควรใช้การเก็บข้อมูลควรเป็น IMO อาจเป็นเพียงตัวเลือกส่วนบุคคล แต่เป็นเวิร์กโฟลว์ที่สะอาดกว่ามีเหตุผลและแนะนำ STASH ซึ่งเป็นคำสั่งที่มีประโยชน์
แพทริค

ไม่มีตัวเลือก "-b" เนื่องจากพาดหัวแสดงให้เห็นว่าคำถามนั้นเกี่ยวกับสาขา "ใหม่"
Guntram

195

นอกจากนี้คุณสามารถสร้างสาขาใหม่และสลับไปที่สาขาโดยทำ:

git checkout -b new_branch
git add .

ฉันใช้สิ่งนี้ตลอดเวลาเพราะฉันมักจะลืมที่จะเริ่มสาขาใหม่ก่อนที่จะเริ่มแก้ไขรหัส


3
ปัญหาเดียวกับ @jouni บันทึกไว้สำหรับคำตอบอื่น ๆ - คุณสามารถพบปัญหาในการรวมสาขากลับเป็นหลักหากการเปลี่ยนแปลงเพิ่มเติมขัดแย้งกับการเปลี่ยนแปลงเดิม IMO กระทู้นี้ตอบคำถามได้ดียิ่งขึ้น: stackoverflow.com/questions/556923/…
jpw

สั้นหวานและมั่นใจ ... "ฉันใช้สิ่งนี้ตลอดเวลา ... "
ϹοδεMεδιϲ

1
อย่าลืมลงมือทำใน new_branch หากคุณเปลี่ยนกลับไปที่สาขาหลักและย้อนกลับไฟล์ที่เปลี่ยนแปลงคุณจะสูญเสียพวกเขาใน new_branch ด้วย
petrsyn

36

ทำไมไม่ใช้ git stash ฉันคิดว่ามันใช้งานง่ายกว่าการคัดลอกและวาง

$ git branch
  develop
* master
  feature1
  TEST
$

คุณมีไฟล์บางไฟล์ในสาขาปัจจุบันที่คุณต้องการย้าย

$ 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
$

ย้ายไปสาขาอื่น

$ git checkout TEST

และนำไปใช้

$ 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
#

ฉันชอบgit stashเพราะฉันใช้git flowซึ่งบ่นเมื่อคุณต้องการที่จะเสร็จสาขาในขณะที่ยังคงมีการเปลี่ยนแปลงในไดเรกทอรีการทำงานของคุณ

เช่นเดียวกับ @Mike Bethany สิ่งนี้เกิดขึ้นกับฉันตลอดเวลาเพราะฉันทำงานกับปัญหาใหม่ในขณะที่ลืมไปว่าฉันยังอยู่ในสาขาอื่น ดังนั้นคุณสามารถซ่อนงานของคุณgit flow feature finish...และสาขาgit stash applyใหม่git flow feature start ...


2
git stashเป็นวิธีที่ฉันต้องการในการจัดการกับการเปลี่ยนแปลงที่ไม่มีข้อผูกมัด แน่นอนว่ามันเป็นวิธีการที่ใช้งานง่ายเมื่อคุณคิดว่ามันถูกตัดและวาง
Matthew Mitchell

นี่เป็นแนวทางที่ดีสำหรับฉัน มันทำงานได้โดยไม่มีปัญหา
Yunus Nedim Mehel

ไม่ทราบว่าคุณสามารถทำได้และใช้งานได้ดี ให้ความรู้สึกเป็นธรรมชาติมากกว่าวิธีอื่น ๆ
glaucon

ฉันคิดว่า stashing เป็นวิธีที่เป็นมืออาชีพมากกว่าแทนที่จะใช้ git checkout แล้วเพิ่ม ฉันคิดว่าคำตอบของคุณควรเป็น 100+ คะแนน
Matrosov Alexander

1
@ Καrτhικgit stash --include-untracked
โหลด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.