私はGitを初めて使用しますが、SVNに精通しています。テストとして、git init
を使用してローカルディレクトリにリポジトリを作成しました。次に、空のリポジトリを別のローカルディレクトリに複製しました(127.0.0.1を使用してSSH経由でテストしたかったのです)。リポジトリ2にいくつかのファイルを追加し、git add *
を実行し、最後にgit commit -a -m "First source code"
を実行しました。
git format-patch
を使用してパッチを作成し、リポジトリ1に適用したいと思います。これを行うにはどうすればよいですか?マニュアルがあることは知っていますが、これらは非常に複雑で、モニターに特定のことをしたくなります。
次の方法でパッチを作成します。
$ git format-patch master --stdout > patch.diff
次に、patch.diffにdiffが含まれます。これを他の人に送信して、以下を使用して適用できます。
$ git am < patch.diff
マニュアルが少し密集している場合は、チュートリアルを探すのが理にかなっていることがあります。
最後のコミット(または最後の数回のコミット)からパッチを作成する最も簡単な方法は、パッチを作成するコミットの数を示す負の数でformat-patch
を使用することです。
git format-patch -1
コミットの説明にちなんで名付けられたパッチファイルを取得します。 am
を使用して、別のリポジトリに挿入します。
git am << name_of_patch_file
GitHubパッチの使用
追加 .patch
パッチファイルを取得するためのコミットURL、例
次のように元のファイルにパッチを適用します。
git am /tmp/b6b3b6a.patch
GitHubdiffの使用
追加 .diff
パッチファイルを取得するためのコミットURL、例
次のように元のファイルにパッチを適用します。
git apply -p0 /tmp/b6b3b6a.diff
Gitを使用している場合、これを行うための適切で簡単な方法は、リモートを使用することです。
cd \path\to\repo1
git remote add otherrepo \path\to\repo2
git fetch otherrepo
git log otherrepo/master ## Find the commit you want to steal in the list
git cherry-pick SOME_SHA1 ## Snag just one commit
git merge otherrepo/master ## Merge all of the new commits from otherrepo/master
これにより、作成者とコミットメッセージを含め、あるリポジトリから別のリポジトリにcommitsが移行され、マージの競合を整理するのに役立ちます(特に、1つ以上のコミットを移動する場合)
Git 2.25(2020年第1四半期)では、 git format-patch
が進化し、サブジェクトとしてブランチの説明( "git branch --edit-description
")をより適切に使用できるようになりました。
commit bf8e65b 、 commit a92331d 、 commit 46273df (15 Oct 2019)を参照してくださいby Denton Liu(Denton-L
) 。
( Junio C Hamano --gitster
- in commit b75ba9b 、2019年11月10日)
format-patch
:--cover-from-description
オプションを教えるサインオフ:Denton Liu
以前は、
format-patch
がカバーレターを生成すると、本文のみにブランチの説明が入力され、件名にはプレースホルダーテキストが入力されていました。ただし、ユーザーは、カバーレターの件名を同じ方法で自動的に入力することを希望する場合があります。
Format-patchに
--cover-from-description
オプションと対応するformat.coverFromDescription
構成を受け入れるように教え、ユーザーが今すぐ件名を含むカバーレター(のさまざまな部分を入力できるようにします)。
git config
ドキュメント に含まれるもの:
format.coverFromDescription:
ブランチの説明を使用してカバーレターのどの部分に入力するかを決定するためのformat-patchのデフォルトモード。
そして git format-patch
:
--cover-from-description=<mode>:
ブランチの説明を使用して、カバーレターのどの部分に自動的に入力されるかを制御します。
<mode>
がmessage
またはdefault
の場合、カバーレターの件名にはプレースホルダーテキストが入力されます。
カバーレターの本文には、支店の説明が入力されます。これは、構成もコマンドラインオプションも指定されていない場合のデフォルトモードです。
<mode>
がsubject
の場合、ブランチの説明の最初の段落にカバーレターの件名が入力されます。
説明の残りの部分は、カバーレターの本文に入力されます。
<mode>
がauto
の場合、ブランチの説明の最初の段落が100バイトより大きい場合、モードはmessage
になり、それ以外の場合はsubject
が使用されます。 。
<mode>
がnone
の場合、カバーレターの件名と本文の両方にプレースホルダーテキストが入力されます。
パッチの作成元である「リポジトリ2」に移動し、git-format-patchを実行してパッチを作成する必要があります。gitformat-patchmaster --stdout> name_of_patch_file
次に、パッチを適用する「リポジトリ1」に移動します。gitapplyname_of_patch_file
パッチが問題を引き起こすかどうかを確認するだけで便利な場合があります:git apply --check name_of_patch_file