48379


gitで、とあるブランチ(今回はmaster)で作業をしていた時にcommitをします。  
この時、前回pullして以降に、同branchに他者がcommitしてると、pushする前にpullしなさいと促されます。  
で、pullすると、mergeが動くんですが、その時の樹形図は以下のようになると思います。

e.g.) redmineの場合

![git branch](https://i.stack.imgur.com/h9H7N.png)

commitする前にpullしてやっていれば、このような樹形図でなく、まっすぐな樹形図になると思います。

そこで知りたいのは、この分岐してしまった樹形図をまっすぐな樹形図にしてやる方法です。  
commitを取り消してやった後、最新の状態に自分の変更を適用してやれば、そうできることは分かるんですが...  
この作業を、何か簡単な手順で行うことが出来ないのか？と思った次第です。

何か簡単な方法で対応できるのでしたら教えていただけると幸いです。  
よろしくお願いします。


CC BY-SA 4.0
2018-09-14T05:05:44.097
48378
2018-09-14T08:45:33.257
2383
question
git
gitでpullしないでcommitした時の樹形図を真っ直ぐにしたい


pullして分岐してしまったコミットツリーに関しては、質問者さんのおっしゃる方法でやり直すのがよいかと思います。

そもそもこのような場合にツリーが分岐するのを避けるには、`git
rebase`が使用可能です。詳しい使い方は質問者さんのほうで調べるのがよろしいかと思いますが、  
`git push`しようとして怒られた場合は、pullせずにまず`git fetch`によりorigin/masterを取得します。  
そして、自分がmasterブランチにいる状態で`git rebase
origin/master`とすることにより、他者がmasterブランチ上で行った変更に対して自分の変更をまっすぐに追加することができます。


CC BY-SA 4.0
2018-09-14T05:12:15.183
48379
2018-09-14T05:21:06.330
2018-09-14T05:21:06.330
30079
30079
48378
answer


同様の趣旨の質問がこちらにありました:

  * [Git - Auto rebase while pushing - Stack Overflow](https://stackoverflow.com/q/43446842/4506703)

以下のコマンドでエイリアス設定を行えば、

[code]

    git config alias.goodpush '!git pull --rebase=preserve && git push'
    
[/code]

以降、`git goodpush`を実行すれば自動でrebaseした後pushするようになります。

最終的な形を確認することなくremoteリポジトリに反映してしまうので、個人的には微妙な対応かと思います…

* * *

`git pull`時の自動mergeを止めることで煩わしさは低減するかもしれません。(上記のエイリアスが実行している内容を手動で行います)

> で、pullすると、mergeが動くんですが、

のタイミングで、単に `git pull` でなく、オプションを付与し `git pull
--rebase=preserve`とすれば、mergeでなくrebaseで変更が統合されます。

この `\--rebase=preserve` オプションを付けた挙動を `git-pull` のデフォルト動作としたい場合には、
コンフィグ設定で`pull.rebase` に `preserve` をセットします。

[code]

    git config --global pull.rebase preserve
    
[/code]

参考:

  * [`git-pull`](https://git-scm.com/docs/git-pull#git-pull--r)
  * [`git-config`](https://git-scm.com/docs/git-config#git-config-pullrebase)


CC BY-SA 4.0
2018-09-14T07:44:07.163
48391
2018-09-14T08:45:33.257
2018-09-14T08:45:33.257
2808
2808
48378
answer