を使用gitk log
すると、2つの違いを見つけることができませんでした。(gitコマンドまたは何らかのツールを使用して)どうすれば違いを確認できますか?
を使用gitk log
すると、2つの違いを見つけることができませんでした。(gitコマンドまたは何らかのツールを使用して)どうすれば違いを確認できますか?
回答:
この--no-ff
フラグは、git merge
現在のものHEAD
がマージしようとしているコミットの祖先であることを検出した場合、「早送り」を実行しないようにします。早送りとは、マージコミットを作成する代わりに、gitがブランチポインターを移動して、受信コミットを指すようにする場合です。これは通常git pull
、ローカルで変更を加えずにを実行すると発生します。
ただし、通常、特定のブランチトポロジを維持する必要があるため(たとえば、トピックブランチにマージしていて、履歴を読み取るときにそのように見えるようにする必要があるため)、この動作の発生を防止したい場合があります。そのためには、あなたが渡すことができ--no-ff
フラグとgit merge
なり、常に早送りの代わりにマージを構築します。
同様に、明示的に早送りするためにa git pull
またはuse を実行し、git merge
早送りできない場合はベイルアウトする場合は、--ff-only
フラグを使用できます。このようにして、定期的に何git pull --ff-only
も考えずに何かを行うことができ、エラーが発生した場合は、戻ってマージするかリベースするかを決定できます。
gitk
かgit log --graph
非早送り1がした一方で、マージを作成していない早送りマージコミットこと。
--no-ff
機能から開発へ、または開発からマスターへの移行は、プルリクエストのマージに似ていると言えるでしょうか。
--no-ff
ます。
以下は、使用の明確な説明と図解のあるサイトgit merge --no-ff
です。
これを見るまでは、gitで完全に迷っていました。を使用--no-ff
すると、誰かが履歴を確認して、作業のためにチェックアウトしたブランチを明確に見ることができます。(このリンクはgithubの「ネットワーク」視覚化ツールを指します)そして、ここにイラスト付きの別の素晴らしいリファレンスがあります。このリファレンスは、最初のリファレンスをうまく補完し、gitにあまり詳しくない人に重点を置いています。
あなたがGit-guruではなく私のような場合、ここでの私の回答は、ローカルファイルシステムからファイルを削除せずにgitの追跡からファイルを削除する処理について説明しています。もう1つの新しい状況は、現在のコードを取得することです。
パッケージをWebサイトに更新し、ワークフローを確認するためにノートに戻る必要がありました。この回答に例を追加すると便利だと思いました。
gitコマンドの私のワークフロー:
git checkout -b contact-form
(do your work on "contact-form")
git status
git commit -am "updated form in contact module"
git checkout master
git merge --no-ff contact-form
git branch -d contact-form
git push origin master
以下:説明を含む実際の使用法。
注:以下の出力は省略されています。gitはかなり冗長です。
$ git status
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ecc/Desktop.php
# modified: ecc/Mobile.php
# deleted: ecc/ecc-config.php
# modified: ecc/readme.txt
# modified: ecc/test.php
# deleted: passthru-adapter.igs
# deleted: shop/mickey/index.php
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# ecc/upgrade.php
# ecc/webgility-config.php
# ecc/webgility-config.php.bak
# ecc/webgility-magento.php
上記の3つのことに注意してください
。1)出力に、新しいファイルの追加を含む、ECCパッケージのアップグレードによる変更が表示されます。
2)また/ecc
、この変更とは別に、私が削除した2つのファイル(フォルダーではない)があることに注意してください。これらのファイルの削除をと混同する代わりに、後でecc
別のcleanup
ブランチを作成して、それらのファイルの削除を反映します。
3)ワークフローに従わなかった!eccを再度動作させるときに、gitのことを忘れていました。
以下:git commit -am "updated ecc package"
通常のようにすべてを含めるのではなく、/ecc
フォルダにファイルを追加するだけで済みます。これらの削除されたファイルは特にの一部ではありませんでしたgit add
が、すでにgitで追跡されているため、このブランチのコミットから削除する必要があります。
$ git checkout -b ecc
$ git add ecc/*
$ git reset HEAD passthru-adapter.igs
$ git reset HEAD shop/mickey/index.php
Unstaged changes after reset:
M passthru-adapter.igs
M shop/mickey/index.php
$ git commit -m "Webgility ecc desktop connector files; integrates with Quickbooks"
$ git checkout master
D passthru-adapter.igs
D shop/mickey/index.php
Switched to branch 'master'
$ git merge --no-ff ecc
$ git branch -d ecc
Deleted branch ecc (was 98269a2).
$ git push origin master
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 59.00 KiB, done.
Total 14 (delta 10), reused 0 (delta 0)
To git@github.com:me/mywebsite.git
8a0d9ec..333eff5 master -> master
このプロセスを1日に10回以上使用して、コマンドを実行するバッチスクリプトを作成することにしたのでgit_update.sh <branch> <"commit message">
、上記の手順を実行するためのほぼ適切なスクリプトを作成しました。これがそのスクリプトのGistソースです。
git commit -am
経由で作成された「変更済み」リストからファイルを選択しgit status
て、このスクリプトに貼り付ける代わりに。これは、私が何十もの編集を行ったが、変更をグループ化するのに役立つようにさまざまなブランチ名が必要だったために起こりました。
--no-ff
オプションとマージした後でも、ブランチを安全に削除できますか?
明示的なマージ:新しいマージコミットを作成します。(これは、を使用し--no-ff
た場合に得られるものです。)
Fast Forward Merge:新しいコミットを作成することなく、すばやく転送します。
リベース:新しいベースレベルを確立します。
スカッシュ:(何か)を力で押しつぶすか押して、平らになるようにします。
この--no-ff
オプションにより、早送りマージが発生せず、新しいコミットオブジェクトが常に作成されます。gitに機能ブランチの履歴を保持させたい場合、これは望ましいことです。
上の画像では、左側が使用後のgit履歴の例でgit merge --no-ff
、右側がgit merge
ffマージが可能な場所での使用例です。
編集:このイメージの以前のバージョンは、マージコミットの単一の親のみを示していました。マージコミットには、 gitが「機能ブランチ」と元のブランチの履歴を維持するために使用する複数の親コミットがあります。複数の親リンクは緑色で強調表示されます。
これは古い質問であり、他の投稿で少し微妙に言及されていますが、このクリックを私にさせた説明は、高速でないマージでは別のコミットが必要になるということです。
git merge --no-ff ecc
場合、git log
forブランチマスターで追加のマージコミットを行うだけです。マスターがコミットの直接の祖先を指している場合、技術的には必要ありませんeccがオンになっていますが、--no-ffオプションを指定することにより、そのマージコミットの作成を強制します。:それはタイトルがありますMerge branch 'ecc'