ฉันจะส่งไฟล์บางไฟล์ได้อย่างไร?


259

ฉันมีสองโครงการ หนึ่งคือโครงการ "เป็นทางการ" และที่สองคือการปรับเปลี่ยนแสง (บางไฟล์เพิ่ม) ฉันสร้างสาขาใหม่และใส่ไฟล์ใหม่เข้าไป แต่ในระหว่างการพัฒนาบางไฟล์ที่พบได้ทั่วไปในทั้งสองสาขาจะเปลี่ยนไป

ฉันจะส่งเฉพาะไฟล์เหล่านี้ได้อย่างไร


โครงการทั้งสองนั้นเชื่อมต่อกับที่เก็บ git เดียวกันหรือไม่
Oleksandr

ใช่มันเป็นที่เก็บข้อมูลเดียวกัน แต่ฉันไม่ต้องการให้สาขาของฉันไปที่เซิร์ฟเวอร์
Nips

เหตุใดคุณจึงไม่รวมสาขาใหม่ของคุณเข้ากับมาสเตอร์ (หรือสาขาอย่างเป็นทางการอื่น ๆ )
Oleksandr

1
คำตอบสำหรับคำถามเหล่านี้จะช่วยให้คุณ: stackoverflow.com/questions/7161860/... stackoverflow.com/questions/7175869/...
Eckes

คำตอบ:


261

ฉันคิดว่าคุณต้องการที่จะส่งมอบการเปลี่ยนแปลงสาขาหนึ่งแล้วทำให้การเปลี่ยนแปลงเหล่านั้นสามารถมองเห็นได้ในสาขาอื่น ใน git คุณไม่ควรมีการเปลี่ยนแปลงด้านบนของ HEAD เมื่อเปลี่ยนสาขา

คุณส่งไฟล์ที่ถูกเปลี่ยนแปลงโดย:

git commit [some files]

หรือถ้าคุณแน่ใจว่าคุณมีพื้นที่จัดเตรียมที่สะอาดคุณก็สามารถทำได้

git add [some files]       # add [some files] to staging area
git add [some more files]  # add [some more files] to staging area
git commit                 # commit [some files] and [some more files]

หากคุณต้องการทำให้การกระทำที่มีอยู่ในทั้งสองสาขาที่คุณทำ

git stash                     # remove all changes from HEAD and save them somewhere else
git checkout <other-project>  # change branches
git cherry-pick <commit-id>   # pick a commit from ANY branch and apply it to the current
git checkout <first-project>  # change to the other branch
git stash pop                 # restore all changes again

22
หากต้องการคอมมิตไฟล์เหล่านั้นอย่างแท้จริงแม้ว่าการเปลี่ยนแปลงอื่น ๆ จะถูกจัดฉากไว้ตัวอย่างที่สอง ( git commit [some files]ซึ่งหมายถึง--onlyสวิตช์) ควรใช้ ตัวอย่างแรก ( git add [some files]ตามด้วยgit commit) จะกระทำการเปลี่ยนแปลงอื่น ๆ ที่มีการจัดฉาก
Lexikos

4
ฉันจะเป็นประโยชน์ในการให้ตัวอย่างสำหรับคอมไพล์คอมมิท [ไฟล์บางไฟล์] เช่นคุณควรแทนที่ [บางไฟล์], จุลภาค, white space อย่างไร
Claudiu Creanga

2
@claudiu โดยปกติแล้วสิ่งที่เปลือกเป็นตัวคั่นช่องว่าง และถ้าคุณดำน้ำลึกพอคุณสามารถเปลี่ยนสิ่งนั้นเป็นอะไรก็ได้
อเล็กซ์

หากคุณสามารถเพิ่มตัวอย่างคำตอบนี้จะดีมาก
Yamur

154

รับรายการไฟล์ที่คุณต้องการคอมมิท

$ git status

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:   file1
modified:   file2
modified:   file3
modified:   file4

เพิ่มไฟล์ลงในการจัดเตรียม

$ git add file1 file2

ตรวจสอบเพื่อดูสิ่งที่คุณกระทำ

$ git status

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   file1
    modified:   file2

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:   file3
    modified:   file4

คอมมิตไฟล์ด้วยข้อความคอมมิท

$ git commit -m "Fixed files 1 and 2"

หากคุณยอมรับไฟล์ผิด

$ git reset --soft HEAD~1

หากคุณต้องการเลิกทำไฟล์และเริ่มใหม่

$ git reset

Unstaged changes after reset:
M file1
M file2
M file3
M file4

92

คุณสามารถคอมมิทไฟล์ที่อัปเดตบางอย่างเช่นนี้:

git commit file1 file2 file5 -m "commit message"

30

บางส่วนนี้ดูเหมือนว่า "ไม่สมบูรณ์"

กลุ่มคนจะไม่ทราบว่าควรใช้เครื่องหมายคำพูด ฯลฯ หรือไม่

เพิ่ม 1 ไฟล์ที่ระบุเส้นทางที่ตั้งเช่นกัน

git add JobManager/Controllers/APIs/ProfileApiController.cs

คอมมิท (จำไว้ว่าคอมมิชชันเป็นโลคัลเท่านั้นไม่มีผลกับระบบอื่น)

git commit -m "your message"  

กดไปที่ repo ระยะไกล

git push  (this is after the commit and this attempts to Merge INTO the remote location you have instructed it to merge into)

คำตอบอื่น ๆ แสดงที่ซ่อนฯลฯ ซึ่งบางครั้งคุณอาจต้องการทำ


11

หากคุณจัดทำไฟล์ไว้เรียบร้อยแล้ว

git reset HEAD [file-name-A.ext] [file-name-B.ext]

จากนั้นเพิ่มกลับทีละนิด


11

สมมติว่าคุณทำการเปลี่ยนแปลงหลายไฟล์เช่น:

  • file1
  • file2
  • file3
  • File4
  • File5

แต่คุณต้องการยอมรับเฉพาะการเปลี่ยนแปลงของ File1 และ File3

มีสองวิธีในการทำสิ่งนี้:

1.Stage ไฟล์ทั้งสองนี้โดยใช้:

git add file1 file2

จากนั้นกระทำ

git commit -m "your message"

จากนั้นดัน

git push

2. กระทำโดยตรง

git commit file1 file3 -m "my message"

จากนั้นดัน

git push

วิธีแรกที่จริงแล้วมีประโยชน์ในกรณีที่หากเราทำการแก้ไขไฟล์เป็นระยะและจัดเตรียมไว้ -> โครงการขนาดใหญ่โดยทั่วไปโครงการสด
แต่ถ้าเราปรับเปลี่ยนไฟล์และไม่จัดเตรียมไฟล์เราสามารถทำการคอมมิตโดยตรง -> โปรเจคเล็ก ๆ ได้


--onlyเมื่อไม่ได้ระบุชื่อแฟ้มเป็นตัวอย่างที่สองแสดงให้เห็นคอมไพล์ถือว่าธงคำสั่งสำหรับข้อโต้แย้งเหล่านี้คือ จากนั้นจะเป็นคำสั่งเดียวกับgit commit --only file1 --only file3 -m "my message"หรือใช้ทางลัดเป็นgit commit -o file1 -o file3 -m "my message"Reference: git-scm.com/docs/git-commit
ผู้ใช้

0

นี่เป็นวิธีการง่ายๆหากคุณไม่มีการเปลี่ยนแปลงรหัสมาก:

1. git stash
2. git stash apply
3. remove the files/code you don't want to commit
4. commit the remaining files/code you do want

จากนั้นถ้าคุณต้องการรหัสที่คุณลบ (บิตที่คุณไม่ได้กระทำ) ในการกระทำที่แยกต่างหากหรือสาขาอื่นแล้วในขณะที่ยังคงอยู่ในสาขานี้ทำ:

5. git stash apply
6. git stash

ด้วยขั้นตอนที่ 5 เมื่อคุณใช้ stash แล้วและยืนยันรหัสที่คุณต้องการในขั้นตอนที่ 4 diff และ untracked ใน stash ที่นำมาใช้ใหม่จะเป็นรหัสที่คุณลบในขั้นตอนที่ 3 ก่อนที่คุณจะยอมรับในขั้นตอนที่ 4

เช่นขั้นตอนที่ 6 เป็นรหัสที่คุณไม่ต้องการ [ต้องการ] เนื่องจากคุณอาจไม่ต้องการสูญเสียการเปลี่ยนแปลงเหล่านั้นใช่ไหม ดังนั้นการสะสมใหม่จากขั้นตอนที่ 6 จึงสามารถกระทำกับสาขานี้หรือสาขาอื่น ๆ ได้ด้วยการทำ git stash ในสาขาที่ถูกต้องและกระทำการ

เห็นได้ชัดว่านี่เป็นการสันนิษฐานว่าคุณทำตามขั้นตอนในขั้นตอนเดียวหากคุณซ่อนที่จุดอื่น ๆ ในขั้นตอนเหล่านี้คุณจะต้องจดบันทึกการอ้างอิงสำหรับแต่ละขั้นตอนด้านบน (แทนที่จะเป็นเพียงแค่การซ่อนพื้นฐานและใช้ที่ซ่อนล่าสุด)

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