Git กระทำไม่เสร็จ แต่ไม่สามารถดำเนินการต่อในเครื่องนั้นได้


11

บางครั้งฉันพบปัญหาในการมีรหัสที่ไม่มีข้อผูกมัดบนเวิร์กสเตชันที่ไม่พร้อมสำหรับการส่งมอบ แต่ต้องดำเนินการให้เสร็จสิ้นบนเวิร์กสเตชันหรือแล็ปท็อปอื่น

ใครบ้างมีวิธีแก้ปัญหานี้เช่น "soft commit" หรือวิธีอื่นในการถ่ายโอนการเปลี่ยนแปลงไปยังเครื่องอื่นเพื่อทำงานกับมันในที่อื่น?

ฉันไม่ต้องการถูกบังคับให้ยอมรับและผลักดันการเปลี่ยนแปลงที่ไม่ได้ดำเนินการอย่างเหมาะสม


2
โพสต์นี้ค่อนข้างอ่านยาก (ผนังข้อความ) คุณจะช่วยแก้ไขมันให้เป็นรูปร่างที่ดีขึ้นได้ไหม
ริ้น

.. เสียงเหมือนคุณหลังจากgit stash...
Simon Whitehead

@ SimonWhitehead ใช่ แต่ฉันสามารถย้าย git stash ไปยังเครื่องอื่นได้อย่างง่ายดายหรือไม่?
csteifel

การกระทำของ Gitทั้งหมดนั้นคือ "soft commits"
user253751

คำตอบ:


12

ต่อไปนี้จะถือว่า repo ในพื้นที่ของคุณเป็นโคลนของ repo บนเซิร์ฟเวอร์อื่นเช่น github; และคุณมีสิทธิ์ในการเปลี่ยนแปลงเซิร์ฟเวอร์อัพสตรีม ในตัวอย่างของฉันฉันได้เรียก repo ต้นกำเนิด "ต้นกำเนิด" นี้ เรียกgit remote showไปที่รายการ repos อื่น ๆ ซึ่งอาจให้คำแนะนำแก่คุณเกี่ยวกับสิ่งที่เรียกว่า

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

  • ในการแยกสาขา repo ของคุณ: git checkout -b MyNewBranch
  • วิธีผลักดันการเปลี่ยนแปลงที่เกิดขึ้นในสาขาใหม่ของคุณ: git push origin MyNewBranch
  • ในการตรวจสอบสาขาในเครื่องอื่น: git checkout MyNewBranch
  • หากต้องการเปลี่ยนเป็นสาขาอื่น (เช่น "master"): git checkout master
  • เมื่ออยู่ในตำแหน่งต้นแบบให้ผสาน MyNewBranch กลับเข้าที่: git merge MyNewBranch
  • ในการแสดงรายการสาขา: git branch

3
ใช่ทำงานเป็นประจำในสาขาส่วนตัวของคุณเองเป็นหลักในการแก้ปัญหานี้ คุณสามารถกระทำได้บ่อยเท่าที่คุณต้องการโดยไม่กระทบต่อผู้อื่น ยิ่งไปกว่านั้นคือการสร้างสาขาใหม่ทุกครั้งที่คุณเริ่มทำงานกับคุณสมบัติใหม่หรือเริ่มแก้ไขข้อบกพร่องใหม่ สิ่งนี้ทำให้ง่ายต่อการข้ามไปมาระหว่างโค้ดเบส
Gort the Robot

นอกจากนี้และเหตุผลที่ฉันทำเช่นนี้: หากคุณทำผิดพลาดไปครึ่งทางคุณสามารถไปที่ข้อตกลงก่อนหน้านี้ในสาขาปัจจุบัน หรือกระโดดกลับคว้าชิ้นส่วนของมันกระโดดไปข้างหน้าและนำไปใช้
AMADANON Inc.

1
วิธีนี้จะไม่รวมถึงการผูกพันที่ไม่สมบูรณ์ในสาขาหลักที่ผสานหรือไม่
eimrek

ใช่และ (ในความคิดของฉัน) นั่นอาจไม่ใช่เรื่องเลวร้าย หากคุณไม่ต้องการให้ทำตามข้างบนจากนั้นแทนที่จะสร้างรหัสของคุณสร้าง diff (ซึ่งรวมถึงการเปลี่ยนแปลงไฟล์ทั้งหมด แต่ไม่มีการคอมมิท) ใช้กับสำเนาใหม่ของสาขาแล้วกดลงไป
AMADANON Inc.

2
เกี่ยวกับ " การเปลี่ยนไปใช้สาขาอื่นgit branch -d master " ฉันสับสนแล้วไม่ได้ขอให้คอมไพล์ลบสาขาหลักหรือไม่? (ที่ประทับใจที่ฉันได้รับจากการอ่านสาขาคอมไพล์คู่มือการอยู่แล้ว)
Tasos Papastylianou

2

คุณสามารถใช้git diffเพื่อสร้างแพตช์แล้วนำไปใช้กับเครื่องอื่น ๆ หรือคุณสามารถสร้างการส่งข้อมูลชั่วคราวจากนั้นดึงข้อมูลจากเครื่องอื่น คุณสามารถสร้างสาขาชั่วคราวในเครื่องอื่นผลักดันคอมมิชชันชั่วคราวที่นั่นจากนั้นลบสาขา

วิธีที่ฉันชอบคือวิธีที่สอง: การสร้างการมอบหมายชั่วคราวจากนั้นไปที่เครื่องอื่นและทำสิ่งนี้:

$ git fetch ssh://first_machine/path/to/repo whatever_branch_i_was_working_on
$ git reset --hard FETCH_HEAD
$ git reset HEAD^

ทำไมจึงซับซ้อนและไม่เพียงแค่ใช้git format-patch?
ลองจับได้ในที่สุด

git diffไม่จริงที่แตกต่างจาก มีบางอย่างที่ฉันขาดหายไปหรือไม่?
aragaer

1
git format-patch deadbee..badcab1e- มันสร้าง.patchไฟล์สำหรับทุกการกระทำแยกกันด้วยชื่อที่ดีและกระทำการเก็บรักษาข้อความ
ลองจับในที่สุด

มันสร้างแพทช์สำหรับการเปลี่ยนแปลงที่ยังไม่ได้ทำหรือไม่? มันแยกดัชนีปัจจุบันและสิ่งที่ยังไม่ได้จัดฉากหรือไม่? ดูเหมือนว่าจะไม่
aragaer

ไม่ไม่ใช่สำหรับการเปลี่ยนแปลงที่ไม่มีข้อผูกมัด / ไม่มีการจัดการ แต่เนื่องจากความมุ่งมั่นไม่ได้ทำร้ายใครตราบใดที่คุณไม่ได้ผลักดันมันควรจะตกลงที่จะกระทำ (ด้วยข้อความที่ชัดเจนว่า "WIP" - กำลังดำเนินการอยู่)
ลองจับได้ในที่สุด

2

ฉันกระทำมัน ฉันผลักมันไปที่สาขาส่วนบุคคลตรวจสอบด้านอื่น ๆ และแก้ไข และลบสาขาส่วนบุคคลเมื่อเสร็จแล้ว

แน่นอนว่าคุณสามารถผลักระหว่าง repos ได้โดยตรงคุณสามารถใช้ bundle หรือformat-patch/ amได้ แต่สาขาส่วนบุคคลคือทางออกที่ง่ายที่สุด และการเขียนประวัติศาสตร์ไม่ได้เป็นเรื่องใหญ่ตราบใดที่มันไม่ผลักไปที่สาขาที่ใช้ร่วมกัน ในหลายโครงการผู้คนควรย้อนกลับไปที่สาขาฟีเจอร์เพื่อให้ง่ายต่อการเข้าใจเพื่อตรวจสอบ


0

วิธีการที่ง่ายคือวิธีที่คุณอธิบาย: คัดลอก.gitไดเรกทอรีที่ซ่อนอยู่และไฟล์โครงการไปยังเครื่องอื่นที่คุณสามารถมอบหมายและเสร็จสิ้นหรือเพียงแค่ทำงานต่อไป

.gitไดเรกทอรีที่ประวัติศาสตร์คอมไพล์ของคุณจะถูกเก็บไว้เพื่อการรักษานี้พร้อมกับไฟล์จริงเก็บประวัติโครงการทั้งหมดของคุณครบถ้วน

หากคุณใช้เครื่องดั้งเดิมอย่างถาวรฉันอาจแนะนำวิธีนี้


0

เช่นเดียวกับคนอื่น ๆ ที่ตอบด้วย Git คุณไม่ควรสนใจรหัสที่ไม่เสร็จในสาขาส่วนตัวของคุณ อย่างไรก็ตามถ้าด้วยเหตุผลบางอย่างคุณจริงๆไม่ต้องการให้งานที่ยังไม่เสร็จของคุณไปสัมผัสกับ repo หลักคุณสามารถใช้ประโยชน์จากธรรมชาติของ Git!

มีเครื่องมือชื่อง่าย ๆgit bundleที่สามารถช่วยให้คุณผ่านการเปลี่ยนแปลงโดยไม่ต้องมีที่เก็บส่วนกลาง ก่อนอื่นลอกเลียนแบบ:

git clone https://github.com/octocat/Spoon-Knife.git working_copy_1
cd working_copy_1

ทำการเปลี่ยนแปลงและส่งไปยังสาขาชั่วคราว:

git checkout -b tmp_branch
git commit -a -m "temporary changes"

ตอนนี้พวกเขารวมการเปลี่ยนแปลง:

git bundle create ../tmp.bundle tmp_branch

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

cd ..
git clone https://github.com/octocat/Spoon-Knife.git working_copy_2
cd working_copy_2

เราต้องปฏิบัติต่อชุดรวมของเราเป็นรีโมตอื่นดังนั้นเราจึงสามารถดึงการเปลี่ยนแปลงจากมันได้

git remote add tmp ../tmp.bundle
git fetch tmp

เนื่องจากประเด็นทั้งหมดคือการถ่ายโอนการเปลี่ยนแปลงโดยไม่ทิ้งร่องรอยเราจะต้องสควอชพวกเขาไปยังสำเนาที่ใช้งานได้เพื่อให้สูญเสียอุณหภูมิที่กระทำ:

git merge tmp/tmp_branch --squash

และสิ่งที่เหลืออยู่คือการลบรีโมตชั่วคราว:

git remote remove tmp

VIOLA! การเปลี่ยนแปลงถูกโอนไปยังสำเนาการทำงานใหม่โดยไม่ทิ้งร่องรอยของสาขาหรือการกระทำ!

แต่จริงๆแล้ว - กระบวนการนี้ค่อนข้างยาวและยุ่งยาก นี่คือ Git ไม่ใช่ SVN - ไม่มีเหตุผลอะไรเลยที่จะไม่ผลักดันสาขาของคุณไปยัง repo ส่วนกลาง

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