Gitコミットは終了していませんが、そのマシンで続行できません


11

時々、コミットの準備ができていないが別のワークステーションまたはラップトップで完了する必要があるワークステーションで、コミットされていないコードを持つという問題に遭遇します。

「ソフトコミット」や、変更を別のマシンに転送して他の場所で動作させる他の方法など、この問題の解決策はありますか?

適切に実装されていない変更をコミットしてプッシュすることを強制されないようにしたいと思います。


2
この投稿は読みにくい(テキストの壁)。それをより良い形に編集してもいいですか?
ブヨ

..あなたが望んでいるように聞こえますgit stash...?
サイモンホワイトヘッド14年

@SimonWhiteheadはい、Git stashを別のマシンに簡単に移動できますか?
csteifel 14年

すべての Gitコミットは「ソフトコミット」です。
user253751

回答:


12

以下は、ローカルリポジトリが別のサーバー(たとえば、github)のリポジトリのクローンであることを前提としています。また、アップストリームサーバーに変更を加える権限があること。私の例では、このアップストリームリポジトリを「オリジン」と呼んでいます。実行git remote showして他のリポジトリを一覧表示します。これにより、そのリポジトリの名前に関するヒントが得られる場合があります。

ブランチを作成することをお勧めします。別のマシンでブランチをチェックアウトできます。実際、作業を開始してすぐにブランチを作成する場合、安定したコードセットがなくても、ブランチに「コミット」し、作業の証跡とバックアップを作成できます。作業に満足したら、それを「マスター」ブランチにマージして戻すことができます。

  • リポジトリを分岐するには: git checkout -b MyNewBranch
  • 新しいブランチのコミットされた変更をプッシュするには: git push origin MyNewBranch
  • 別のマシンでブランチをチェックアウトするには: git checkout MyNewBranch
  • 別のブランチ(「マスター」など)に切り替えるには: git checkout master
  • マスターの場合、MyNewBranchをマージして戻すには: git merge MyNewBranch
  • ブランチをリストするには: git branch

3
はい、あなた自身のプライベートブランチで常に働くことは、本質的にこの問題を解決します。他の人に影響を与えることなく、何度でもコミットできます。さらに良いのは、新しい機能の作業を開始するたびに、または新しい欠陥の修正を開始するたびに、新しいブランチを作成することです。これにより、コードベース間を簡単に行き来できます。
ロボットをゲット14

また、私がこれを行う理由:途中で間違えた場合は、現在のブランチで以前のコミットに移動できます。または、後ろにジャンプしてその一部をつかみ、前にジャンプして適用します。
アマダノン株式会社14年

1
このメソッドには、マージされたマスターブランチの不完全なコミットも含まれませんか?
eimrek

はい、そして(私の意見では)それはおそらく悪いことではありません。それが望ましくない場合は、上記を実行し、コードをコミットする代わりに、差分(すべてのファイル変更を含むが、コミットは含まない)を作成し、それをブランチの新しいコピーに適用してからプッシュします。
アマダノン株式会社

2
別のブランチに切り替えるにgit branch -d masterは」ということに関して、私は混乱しています、それはgitにmasterブランチを削除するように頼まないのですか?? (とにかくgitブランチマニュアルを読むことで得られる印象です)
Tasos Papastylianou

2

を使用git diffしてパッチを作成し、それを他のマシンに適用できます。または、一時コミットを作成してから、他のマシンからプルすることができます。他のマシンに一時ブランチを作成し、そこに一時コミットをプッシュしてから、ブランチを削除することもできます。

私のお気に入りの方法は2番目の方法です。一時的なコミットを作成してから、別のマシンに移動して次のようなことを行います。

$ 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ですか?
try-catch-finally

本当に違いはありませんgit diff。私が欠けているものはありますか?
-aragaer

1
git format-patch deadbee..badcab1e- .patchナイスネームとコミットメッセージが保存された状態で、コミットごとにファイルを個別に作成します。
try-catch-finally

まだコミットされていない変更のパッチも作成しますか?現在のインデックスとまだステージングされていないものを分離しますか?そうではないようです。
-aragaer

いいえ、コミットされていない/ステージングされていない変更ではありません。ただし、プッシュしない限り、コミットは他の人を傷つけませんので、コミットしても構いません(「WIP」-進行中の作業という明確なメッセージが表示されます)。
try-catch-finally

2

私は、コミットそれを。私はそれを個人のブランチプッシュし、反対側でチェックアウトして修正します。完了したら、個人用ブランチを削除します。

もちろん、レポジトリ間で直接プッシュすることもできますが、bundleまたはformat-patch/を使用することもできますamが、個人のブランチがはるかに簡単なソリューションです。また、共有ブランチにプッシュされない限り、履歴の書き換えは大したことではありません。多くのプロジェクトでは人はいるはずレビューのために理解しやすく、それらを維持するために機能ブランチを巻き戻します。


0

簡単なアプローチは、あなたが説明するものです。.git隠しディレクトリとプロジェクトファイルを別のマシンにコピーし、そこでコミットして終了するか、そのまま作業を続けることができます。

.gitディレクトリは、あなたのgitの履歴が保持されているので、実際のファイルと一緒にこれを保存すると、プロジェクト全体の歴史はそのまま維持しています。

元のマシンを永続的に使用している場合は、おそらくこのアプローチをお勧めします。


0

他の人が答えたように、Gitを使用すると、個人ブランチの未完成のコードを気にする必要はありません。ただし、何らかの理由で、未完成の作業がメインのレポに触れることを本当に望まない場合は、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

ビオラ!変更は、ブランチもコミットも残さずに、新しい作業コピーに転送されました!

しかし、本当に-このプロセスは非常に長くて面倒です。これはGitであり、SVNではありません。個人のブランチを中央リポジトリにプッシュしない理由はないはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.