最近習ったGitテクニック

4747 ワード

提出記録の整理
1つの機能を完了したり、1つの問題を修復したりするには、複数回のコミットが必要になる場合がありますが、プライマリ・リリース・ブランチにMRを開始する場合は、コミット・レコードの数が多すぎて美しくありません.この場合、コミット・レコードを整理する必要があります.
コミットレコードを整理するにはrebaseが一般的です.端末にgit rebase-i origin/xxxと入力します.ここでxxxはMRを開始する必要があるブランチを表します(注:xxxは一般的にブランチを保護し、-iはrebaseインタラクティブモードを表します).
  1 pick 1204858 fix 123
  2 pick 379415c fix 12
  3 pick f7e189f 2233444
  4 pick ab3aa25 bug 1
  5 pick a8f5ee3 new function 1
  6
  7 # Rebase 2c6c58f..a8f5ee3 onto 2c6c58f (5 commands)
  8 #
  9 # Commands:
 10 # p, pick = use commit
 11 # r, reword = use commit, but edit the commit message
 12 # e, edit = use commit, but stop for amending
 13 # s, squash = use commit, but meld into previous commit
 14 # f, fixup = like "squash", but discard this commit's log message
 15 # x, exec = run command (the rest of the line) using shell
 16 # d, drop = remove commit

上記のコミットを大きなコミットに統合し、MRをパブリッシュブランチに統合する必要があります.具体的には、最初のpickを除くpickをsに変更し、
sはsquashを表し、整理、圧縮の意味がある.
  1 pick 1204858 fix 123
  2 s 379415c fix 12
  3 s f7e189f 2233444
  4 s ab3aa25 bug 1
  5 s a8f5ee3 new function 1
  6
  7 # Rebase 2c6c58f..a8f5ee3 onto 2c6c58f (5 commands)
  8 #
  9 # Commands:
 10 # p, pick = use commit
 11 # r, reword = use commit, but edit the commit message
 12 # e, edit = use commit, but stop for amending
 13 # s, squash = use commit, but meld into previous commit
 14 # f, fixup = like "squash", but discard this commit's log message
 15 # x, exec = run command (the rest of the line) using shell
 16 # d, drop = remove commit

その後、commit情報を変更するウィンドウに戻り、コミット情報を変更し、終了を保存します.
  1 # This is a combination of 5 commits.
  2         
  3
  4
  5
  6
  7
  8
  9
 10 # Please enter the commit message for your changes. Lines starting
 11 # with '#' will be ignored, and an empty message aborts the commit.
 12 #
 13 # Date:      Wed Oct 25 10:51:28 2017 +0800
 14 #
 15 # interactive rebase in progress; onto 2c6c58f
 16 # Last commands done (5 commands done):
 17 #    squash ab3aa25 bug 1
 18 #    squash a8f5ee3 new function 1

最後にgit logを使って提出記録を見てみましょう.以下のlogからわかりますが、私たちは確かに何度も提出を合併しました.この時、発表分岐にきれいなMRを提出することができます.しかし、上記の5回のコミットレコードが増加したリモートブランチにコミットされたと仮定すると、ローカルrebaseの後、pushが遠位端に達すると衝突し、pushがテスト-fを加えて実現されるように強制する必要があります.
commit 40bfba9817ab6748c62e55913a28400b7c07683b (HEAD -> dev)
Author: lux <[email protected]>
Date:   Wed Oct 25 10:51:28 2017 +0800

            

commit 2c6c58fcc07617f4596b191a38fa6675ccf8ef00 (origin/master, origin/dev, origin/HEAD)
Author: lux <[email protected]>
Date:   Sun Oct 8 17:51:24 2017 +0800

    edit

commit 26990fe3ec645d7d49df6b283b7db212394d8838
Author: lux <[email protected]>
Date:   Wed Oct 4 17:35:11 2017 +0800

    init

commit 8c96f35366309939b591fa4b87e9d062f22adcf7

rebaseは強力な両刃の剣で、興味があればmergeとrebaseの違いを比較することができます.rebaseは、より明確なコミットを生成するのにある程度役立ちますが、コミットレコードを書き換えるため、rebaseの後はpushのみを自分の遠位ブランチに強制し、MRを介してパブリッシュブランチにマージすることが望ましいです.
Ideaでrebase操作を行うと簡単ですが、Version Controlのログでマージする必要がある最初のコミットレコードを選択し、右クリックするとInteractively Rebase from Hereがあり、クリックするとメニューが飛び出します.上記と同じように、最初の後をsに変更し、OKし、コミット情報を書き直します.確定すると、マージのコミットが完了します.
現在のコミットの一部を別のブランチに抽出
一部のコミットはローカルにコミットされている場合がありますが、ローカルに以前のコミットとは関係のないものがコミットされている場合がありますが、前のコミットを新しいリモートブランチにプッシュしたいと思っています.
たとえば、次のローカルコミットレコードがあります.
1.バグ不足の修復40 bfba 9817 ab 6748 c 62 e 55913 a 28400 b 7 c 07683 b
2.ご飯がおいしくない問題を修復する1204858 cf 7 c 1 cab 54 fc 28 f 196033 b 21933 bfe 7 a 2
3.天気の比較的寒い問題を修復する2 c 6 c 58 fcc 07617 f 4596 b 191 a 38 fa 6675 ccf 8 ef 00
もし私たちがオンライン2の機能しか必要としないならば、1はまだ完全にできていません.このとき、私たちは遠くからブランチcheck outを発表して新しいブランチを出しました.
その後、git cherry-pick 1204858 cf 7 c 1 cab 54 fc 28 f 196033 b 21933 bfe 7 a 2を新しいブランチで実行し、このとき、この2のコミットは新しいブランチに置かれ、その後、新しいブランチMRでパブリッシュブランチにマージすることができます.
gitを使用して仮想マシンとローカルコードの変更を同期
プログラムが仮想マシンやサーバの中を走っている場合(一般的にはローカルではあまり走れないもの)、そのローカルのコード修正は仮想マシンに同期する必要があります.
現在の解決策は以下の通りである
1.仮想マシンとローカルでnfsまたは他のネットワークファイルシステムを使用してフォルダを共有することで、両方の同期を保証できます.これはずいぶん前に使ったことがありますが、なんだか面倒な感じがします.
2.ローカル修正をリモートに送り、仮想マシンをリモートfetchから、これも使えますが、リモート提出記録が発生しました.自分のブランチですが、なんだか不合理で、サーバーに行かなければなりません.
3.gitのremote機能を使用することで、仮想マシンに直接コードをプッシュし、使いやすくなります
大まかな使用手順は以下の通りです.
  • ローカルプロジェクトの新しい追跡リモートを追加:git remote add xnjusername@host:/xxx/xxx、usernameは仮想マシンのユーザー名、hostは仮想マシンip、/xxx/xxxはプロジェクトの仮想マシン内の絶対パス(注L:このようにコードをプッシュするたびに、仮想マシンのパスワードを入力する必要があります.~/.ssh/configで秘密鍵アクセスを構成することができ、パスワードを入力する必要はありません)
  • その後pushコード:git push xnj xxx:yyy,yyyはあなたのブランチ名です.しかし、pushの場合、仮想マシンのyyyがcheck outされている場合、pushは拒否され、解決策は最も簡単で、まず他のものに切り替え、pushでもresetでも、まだ試したことがありません.

  • リファレンスドキュメント
    1.Git Book
    2.ihower
    3.ボスの指導