Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

git push `--force-with-lease`はいつも安全?

git push --force-with-leasegit push --forceと違って、他の人がpushしていたら良い感じにコケてくれるので安全、という話を聞き、さっそく使っています。



git 2.6.4で確認


man git-pushを見るとこんな記述があります。

--force-with-lease alone, without specifying the details, will protect all remote refs that are going to be updated by requiring their current value to be the same as the remote-tracking branch we have for them.

つまり--force-with-leaseはremote refsとローカルのremote-tracking branchのrefsの間に違いがないかどうかで、正否を判定しているわけですね。

remoteのrefsはgit ls-remoteで見られて、多分これと一致判定をしている様子です。

なので、remote-tracking branchのrefsが、push --force-with-lease時のremote refsと一致しているときは通る、ということです。


ということは、push --force-with-lease前にfetchをしていると、refsが一致して問題ないって勘違いしちゃう。

git checkout dev

# いくつかの変更をコミット & 同時にremoteに他の人がpush

git fetch origin dev
git push --force-with-lease origin dev


git checkout dev

# ↓ここ
git fetch origin
git rebase origin/master
git push --force-with-lease origin dev

git fetch originとすると全部のブランチがfetchされるのですが、現在いるトピックブランチもfetchされてしまうので、結果的にさっきの例と同じ状況になってしまう、というわけですね。

僕はよくこういうことやるので、しっかりとgit fetch origin masterとしたうえでrebaseしないとな、と思った次第です。

※もしくは、remote-tracking branchのorigin/masterに対するrebaseではなく、ローカルへmasterをpullしてからrebaseすればこの問題は起こりません

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Help us understand the problem. What are the problem?