Git cam kết chưa hoàn thành nhưng không thể tiếp tục trên máy đó


11

Đôi khi tôi gặp phải vấn đề có mã không được cam kết trên một máy trạm chưa sẵn sàng cho một cam kết nhưng cần phải được hoàn thành trên một máy trạm hoặc máy tính xách tay khác.

Có ai có giải pháp cho vấn đề này, chẳng hạn như "cam kết mềm" hoặc một số cách khác để chuyển các thay đổi sang máy khác để xử lý chúng ở nơi khác không?

Tôi muốn không bị buộc phải cam kết và thúc đẩy những thay đổi không được thực hiện đúng.


2
bài này khá khó đọc (tường văn bản). Bạn có phiền chỉnh sửa ing nó thành một hình dạng tốt hơn?
gnat

.. vết thương như bạn sau git stash...?
Simon Whitehead

@SimonWhitehead có nhưng tôi có thể chuyển một git stash sang máy khác dễ dàng không?
csteifel

Tất cả các cam kết Git là "cam kết mềm".
dùng253751

Câu trả lời:


12

Sau đây giả định repo cục bộ của bạn là một bản sao của repo trên một máy chủ khác, ví dụ như github; và rằng bạn có quyền thay đổi máy chủ ngược dòng. Trong ví dụ của tôi, tôi đã gọi repo ngược dòng này là "nguồn gốc". Chạy git remote showđể liệt kê các repos khác, điều này có thể cho bạn một gợi ý về những gì nó được gọi.

Tôi sẽ đề nghị làm một chi nhánh, sau đó bạn có thể kiểm tra chi nhánh trên một máy khác. Trên thực tế, nếu bạn tạo một chi nhánh ngay khi bạn bắt đầu làm việc, bạn có thể "cam kết" với chi nhánh của mình, có một dấu vết và sao lưu công việc của bạn, mà không cần phải có một bộ mã ổn định. Một khi bạn hài lòng với công việc của mình, bạn có thể hợp nhất nó trở lại vào nhánh "chính" của bạn.

  • Để phân nhánh repo của bạn: git checkout -b MyNewBranch
  • Để thúc đẩy các thay đổi đã cam kết của chi nhánh mới của bạn: git push origin MyNewBranch
  • Để kiểm tra một chi nhánh trên máy khác: git checkout MyNewBranch
  • Để chuyển sang một nhánh khác (ví dụ: "master"): git checkout master
  • Khi ở chế độ chính, để hợp nhất MyNewBranch trở lại: git merge MyNewBranch
  • Để liệt kê các chi nhánh: git branch

3
Có, luôn luôn làm việc trong chi nhánh riêng của bạn về cơ bản giải quyết vấn đề này. Bạn có thể cam kết thường xuyên như bạn muốn mà không ảnh hưởng đến bất kỳ ai khác. Thậm chí tốt hơn là tạo một nhánh mới mỗi khi bạn bắt đầu làm việc trên một tính năng mới hoặc bắt đầu sửa một lỗi mới. Điều này làm cho nó rất dễ dàng để nhảy qua lại giữa các cơ sở mã.
Gort Robot

Ngoài ra, và lý do tôi làm điều này: nếu bạn mắc lỗi nửa chừng, bạn có thể đi đến các cam kết trước đó trên nhánh hiện tại. Hoặc, nhảy trở lại, lấy một phần của nó, nhảy về phía trước và áp dụng.
AMADANON Inc.

1
Không phải phương pháp này cũng bao gồm các cam kết chưa hoàn thành trong nhánh chính được hợp nhất?
eimrek

Vâng, và (theo tôi) đó có lẽ không phải là một điều xấu. Nếu bạn không muốn điều đó, hãy làm như trên, sau đó thay vì cam kết mã của bạn, hãy tạo một khác biệt (bao gồm tất cả các thay đổi tệp, nhưng không cam kết), áp dụng nó cho một bản sao mới của chi nhánh, sau đó đẩy nó.
AMADANON Inc.

2
liên quan đến " Để chuyển sang chi nhánh khácgit branch -d master ", tôi bối rối, không yêu cầu git xóa chi nhánh chính ?? (đó là ấn tượng tôi có được từ việc đọc hướng dẫn chi nhánh git nào)
Tasos Papastylianou

2

Bạn có thể sử dụng git diffđể tạo một bản vá và sau đó áp dụng nó trên máy khác. Hoặc bạn có thể tạo một cam kết tạm thời, sau đó kéo nó từ máy khác. Bạn thậm chí có thể tạo một nhánh tạm thời trên một số máy khác, đẩy cam kết tạm thời của bạn ở đó, sau đó xóa chi nhánh.

Phương pháp yêu thích của tôi là phương pháp thứ hai: tạo một cam kết tạm thời, sau đó đi đến một máy khác và thực hiện một cái gì đó như thế này:

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

Tại sao rất phức tạp và không chỉ sử dụng git format-patch?
thử-bắt-cuối cùng

Không thực sự khác biệt với git diff. Có thiếu điều gì không?
aragaer

1
git format-patch deadbee..badcab1e- Nó tạo .patchcác tệp cho mỗi cam kết riêng biệt với tên đẹp và thông điệp cam kết được bảo tồn.
thử-bắt-cuối cùng

Liệu nó cũng tạo ra một bản vá cho những thay đổi chưa được cam kết? Liệu nó có phân tách chỉ mục hiện tại và những thứ chưa được dàn dựng? Có vẻ như không.
aragaer

Không, không dành cho những thay đổi không được cam kết / không được thực hiện. Nhưng vì một cam kết không gây tổn hại cho bất kỳ ai khác, miễn là bạn không thúc ép thì nên cam kết (với một thông báo rõ ràng có nội dung "WIP" - đang tiến hành).
thử bắt cuối cùng vào

2

Tôi cam kết nó. Tôi đẩy nó đến chi nhánh cá nhân , kiểm tra ở phía bên kia và sửa đổi. Và xóa chi nhánh cá nhân khi hoàn thành.

Tất nhiên bạn có thể đẩy trực tiếp giữa các repos, bạn có thể sử dụng gói hoặc format-patch/ am, nhưng một nhánh cá nhân là giải pháp đơn giản nhất. Và viết lại lịch sử không phải là vấn đề lớn miễn là nó không bị đẩy sang bất kỳ chi nhánh chia sẻ nào. Trong nhiều dự án, mọi người có nghĩa vụ tua lại các nhánh tính năng để giữ cho chúng dễ hiểu hơn để xem xét.


0

Cách tiếp cận dễ dàng là cách bạn mô tả: sao chép .gitthư mục ẩn và tệp dự án sang một máy khác nơi bạn có thể cam kết và hoàn thành hoặc chỉ tiếp tục làm việc.

Thư mục .gitlà nơi lưu giữ lịch sử git của bạn, vì vậy việc lưu giữ tệp này cùng với các tệp thực tế sẽ giữ nguyên toàn bộ lịch sử dự án của bạn.

Nếu bạn hoàn thành vĩnh viễn bằng cách sử dụng máy ban đầu, có lẽ tôi muốn giới thiệu phương pháp này.


0

Giống như những người khác đã trả lời, với Git, bạn không nên quan tâm đến mã chưa hoàn thành trong các chi nhánh cá nhân của mình. Tuy nhiên, nếu vì một lý do nào đó, bạn thực sự thực sự không muốn công việc còn dang dở của mình chạm vào repo chính, bạn có thể sử dụng bản chất phân tán của Git!

Có một công cụ đơn giản có tên git bundlegiúp bạn dễ dàng vượt qua các thay đổi xung quanh mà không cần kho lưu trữ trung tâm. Đầu tiên, sao chép repo:

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

thực hiện một số thay đổi và cam kết chúng với một nhánh tạm thời:

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

Bây giờ, gói chúng thay đổi:

git bundle create ../tmp.bundle tmp_branch

Bây giờ bạn có một tệp bó bạn có thể gửi thư đến máy mới của bạn. Làm thế nào để bạn sử dụng nó ở đó? Hãy tạo một bản sao làm việc mới:

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

chúng ta cần coi gói của chúng ta như một điều khiển từ xa khác, vì vậy chúng ta có thể tìm nạp các thay đổi từ nó

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

vì toàn bộ vấn đề là chuyển các thay đổi mà không để lại dấu vết, chúng tôi sẽ muốn nén chúng vào bản sao làm việc để mất cam kết tạm thời:

git merge tmp/tmp_branch --squash

và tất cả những gì còn lại là loại bỏ điều khiển từ xa tạm thời:

git remote remove tmp

VIola! Các thay đổi đã được chuyển sang bản sao làm việc mới mà không để lại dấu vết của cả chi nhánh và cam kết!

Nhưng thực sự - quá trình này khá dài và cồng kềnh. Đây là Git, không phải SVN - thực sự không nên có bất kỳ lý do nào để không đẩy chi nhánh cá nhân của bạn đến repo trung tâm.

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.