Gitブランチ管理
ほとんどすべてのバージョン管理システムは、何らかの形でブランチをサポートしています。ブランチを使用すると、開発のメインラインから分離して、メインラインに影響を与えることなく作業を続行できます。
Gitのブランチモデルを涅槃機能と呼ぶ人もいますが、Gitをバージョン管理システムのファミリーと区別しているのはまさにそのためです。
ブランチコマンドの作成:
gitブランチ(ブランチ名)
ブランチコマンドの切り替え:
git checkout(ブランチ名)
ブランチを作成し、新しく作成されたブランチに切り替えます
git checkout -b(ブランチ名)
[root @ jinkai newfile] #gitブランチ
*メイン
[root @ jinkai newfile] #git branch admin
[root @ jinkai newfile] #gitブランチ
管理者
*メイン
[root @ jinkai newfile] #git checkout admin
ブランチ「admin」に切り替えます
[root @ jinkai newfile] #gitブランチ
*管理者
メイン
ブランチを切り替えると、Gitは作業ディレクトリの内容をそのブランチの最後にコミットされたスナップショットに置き換えるため、複数のブランチに複数のディレクトリは必要ありません。
ただし、git addがライブラリに追加されると、各ブランチのコンテンツは次のように個別になります。1.txtが次のようにadminブランチに追加されたら、メインブランチに戻って、ないことを確認します。
[root @ jinkai newfile] #git checkout admin
ブランチ「admin」に切り替えます
[root @ jinkai newfile] #echo 11111> 1.txt
[root @ jinkai newfile] #git add 1.txt
[root @ jinkai newfile] #git commit -m "touch 1.txt"
[admin 13f3b30] touch 1.txt
1つのファイルが変更され、1つの挿入(+)
作成モード1006441.txt
[root@jinkai newfile]# ls
1.txt a.txt README.md
[root @ jinkai newfile] #git checkout main
ブランチ「メイン」に切り替えます
[root@jinkai newfile]# ls
a.txt README.md
支店の合併:
ブランチをマージする前に、ターゲットブランチに切り替えて、adminブランチをmainにマージします
[root @ jinkai newfile] #git checkout main
すでに「メイン」にあります
[root @ jinkai newfile] #git merge admin
更新957bc21..13f3b30
早送り
1.txt | 1 +
1つのファイルが変更され、1つの挿入(+)
作成モード1006441.txt
合併から生じる紛争:
adminブランチとmainブランチの両方がa.txtを編集している場合、マージ時に競合が発生します。マージを続行するには、競合を解決する必要があります。
競合を解決する方法は、メインブランチの下のa.txtを編集し、それをadminブランチ内のa.txtのコンテンツに変更することです。次に、a.txtを送信してから、adminブランチをマージします。
[root @ jinkai newfile] #git merge admin
a.txtを自動的にマージします
競合(コンテンツ):a.txtの競合をマージします
自動マージが失敗し、競合を修正して、修正された結果を送信します。
[root @ jinkai newfile] #cat a.txt
yyyy
<<<<<<< HEAD
mainmainmainmain
=======
mainmainmain
adminadminadmin
\ >>>>>>>管理者
[root @ jinkai newfile] #vim a.txt
[root @ jinkai newfile] #git add a.txt
[root @ jinkai newfile] #git commit -m "main file a.txt"
[メイン7baca4e]メインファイルa.txt
[root @ jinkai newfile] #git merge admin
すでに最新です。
しかし、問題があります。メインブランチのコンテンツが必要なものである場合はどうなりますか?a.txtの内容を編集し、必要なものに変更してから送信することができます。adminブランチに切り替えてから、mainブランチをadminブランチにマージします(逆マージ)。
[root @ jinkai newfile] #git checkout admin
ブランチ「admin」に切り替えます
[root @ jinkai newfile] #git merge main
アップデート3445592..f2828c2
早送り
a.txt | 1-
1つのファイルが変更され、1つの削除(-)
[root @ jinkai newfile] #cat a.txt
yyyy
mainmainmain
ブランチをマージする原則は、最新のブランチを古いブランチにマージすることです。つまり、マージ後のブランチ名は最新のブランチである必要があります。
ブランチの削除:
git branch -d admin
ブランチがマージされていない場合は、削除する前にプロンプトが表示され、マージせずに強制的に削除されます
gitブランチ-D管理者
削除されたブランチを復元するには:
Gitはブランチ管理を担当するため、ブランチを削除すると、Gitは関連するコミットへのポインターのみを削除しますが、コミットオブジェクトは引き続きリポジトリに残ります。
したがって、ブランチが削除されたときのハッシュ値がわかっていれば、削除されたブランチを復元できます。コミットのハッシュ値がわかっている場合は、ブランチを回復します。
gitブランチ<branch_name> <hash_val>
復元するブランチのハッシュ値がわからない場合は、reflogコマンドを使用して見つけることができます。といった:
[root @ jinkai newfile] #git branch -d admin
ブランチ管理者(以前のca5f319)は削除されました。
[root @ jinkai newfile] #git branch admin HEAD @ {0}
reflog **コマンド**:
すべてのブランチのコミットを含む、ローカルリポジトリ全体のコミット、および取り消されたコミットも表示します。
HEADが変更されている限り、reflogに表示されます。
このとき、復元ブランチa_branchブランチは次のとおりです。
git branch admin HEAD @ {0}
ブランチの使用の原則:
ブランチアプリケーションの場合、次の原則に従うことをお勧めします。
メインブランチは非常に重要です。このブランチをオンラインコードリリースに使用します。通常、このブランチでコードを開発することはありません。
開発専用のdevブランチを作成し、オンラインで公開する前にのみdevブランチをmainにマージします。
開発者は、devに基づいてパーソナルブランチに分岐し、パーソナルブランチ(自分のPC上)でコードを開発してから、devブランチにマージする必要があります。
devブランチがbobブランチをマージするためのコマンドは次のとおりです。
[root @ jinkai newfile] #git checkout dev
ブランチ「dev」に切り替えます
[root @ jinkai newfile] #git merge bob
すでに最新です。
[root @ jinkai newfile] #git checkout main
ブランチ「メイン」に切り替えます
[root @ jinkai newfile] #git merge dev
すでに最新です。
リモートブランチ管理
新しく作成されたローカルブランチがリモートにプッシュされない場合、他のユーザーには表示されません
リモートブランチを表示する:
gitls-リモートオリジン
[root @ jinkai newfile]#gitls-リモートオリジン
f2828c2b54dfd986da7a8798733b19bf82793145ヘッド
f2828c2b54dfd986da7a8798733b19bf82793145 refs / heads / main
gitプッシュブランチには2つのケースがあります
ローカルブランチとリモートブランチが同じ場合
git pushは、すべてのローカルブランチの変更を一緒にリモートにプッシュします。1つのブランチのみをプッシュする場合は、git push originbranch-nameを使用します。
[root @ jinkai newfile] #git push origin admin
合計0(デルタ0)、再利用0(デルタ0)
リモート:
リモート:次の場所にアクセスして、GitHubで「admin」のプルリクエストを作成します。
リモート:https://github.com/jinkai-linux/newfile/pull/new/admin
リモート:
https://github.com/jinkai-linux/newfile.git
* [新しいブランチ] admin-> admin
リモートブランチよりもローカルブランチの数が多い場合、デフォルトではgit pushはローカルブランチとリモートブランチのみをプッシュします。追加のローカルブランチをリモートにプッシュする場合は、git push origin branch-nameを使用します。プッシュが失敗した場合は、最初にgitを使用します。プルしてリモートの新しいコミットを取得します
git cloneの場合、デフォルトではメインブランチのみが複製されます。すべてのブランチを複製する場合は、手動で作成する必要があります。リモートブランチに対応するブランチをローカルで作成するには、git checkout -b branch-name origin / branchを使用します。 -name、localリモートブランチの名前と同じ
エラー:
[root @ jinkai newfile] #git checkout -b dev origin / dev
致命的:パスの更新とブランチ 'dev'への切り替えを同時に行うことはできません。
コミットとして解決できない「origin / dev」をチェックアウトするつもりでしたか?
解決策1:
ローカルブランチを作成する
git checkout -b dev
それから彼の出発点をリセットします
git reset --hard origin / dev
git fetch originを実行し、実行する前にリモートdevブランチが存在することを確認してください。
[root @ jinkai newfile] #gitブランチ
管理者
*開発
メイン
解決策2:
git remote show origin
git remote update
git fetch
git checkout -b dev origin / dev
ラベル管理
ラベルはスナップショット機能に似ており、バージョンライブラリにラベルを付けて、特定の時点でのライブラリの状態を記録できます。また、いつでもこの状態に戻すことができます。
git checkout main //最初にメインブランチにカット
git tag v1.0 // tag main v1.0
git show v1.0 //ラベル情報を表示する
git tag //すべてのタグを表示できます
タグはコミット用なので、履歴コミット用にタグを付けることができます
git log --pretty = oneline --abbrev-commit //最初に履歴コミットを確認します
git tag v0.9 f60f5d1 //履歴コミットのタグ
git tag -a v0.8 -m "tag just v1.1 and etc." 1cdb957 //タグを記述できます
git tag -d v0.8 //タグを削除します
git push origin v1.0 //指定されたラベルをリモートにプッシュします
git push --tag origin //すべてのタグをプッシュします
ラベルをローカルで削除する場合、リモートで削除する場合は次のようにする必要があります。
git tag v1.0 -d //ローカルタグを削除します
git push origin:refs / tags / v1.0 //リモートタグを削除します
[root @ jinkai newfile] #git tag v1.0
[root @ jinkai newfile] #git show v1.0
コミットf2828c2b54dfd986da7a8798733b19bf82793145
作者:root <[email protected]>
日付:日曜日12月13日00:08:24 2020 +0800
メインファイルa.txt
diff --git a / a.txt b / a.txt
インデックス1383736..384c402100644
--- a / a.txt
+++ b / a.txt
@@ -1,3 +1,2 @@
yyyy
mainmainmain
-adminadminadmin
[root @ jinkai newfile] #git tag
v1.0
[root @ jinkai newfile] #git log --pretty = oneline --abbrev-commit
f2828c2メインファイルa.txt
7baca4eメインファイルa.txt
61ecf5bメインファイルa.txt
3445592管理ファイルa.txt
269659aメインファイルa.txt
13f3b30 touch 1.txt
957bc21 wowowo
f60f5d1 whowhowho
1cdb957 wowowo
c36e391a.txtを更新
d3b0dc5新しいファイルa.txt
ca5f319管理ファイルa.txt
f701012README.mdを更新します
14cef13README.mdを更新します
f278ae1の最初のコミット
[root @ jinkai newfile] #git tag v0.9 f60f5d1
[root @ jinkai newfile] #git tag -a v0.8 -m "tag just v1.1 and etc." 1cdb957
[root @ jinkai newfile] #git tag
v0.8
v0.9
v1.0
[root @ jinkai newfile] #git tag -d v0.8
タグ「v0.8」を削除しました(以前は16b3de5でした)
[root @ jinkai newfile] #git push origin v1.0
合計0(デルタ0)、再利用0(デルタ0)
https://github.com/jinkai-linux/newfile.git
* [新しいタグ] v1.0-> v1.0
[root @ jinkai newfile] #git push --tag origin
合計0(デルタ0)、再利用0(デルタ0)
https://github.com/jinkai-linux/newfile.git
* [新しいタグ] v0.9-> v0.9
[root @ jinkai newfile] #git tag v0.9 -d
タグ「v0.9」を削除しました(以前はf60f5d1でした)
[root @ jinkai newfile] #git push origin:refs / tags / v0.9
https://github.com/jinkai-linux/newfile.git
-[削除済み] v0.9
gitエイリアス
git commitコマンドは少し長いですか?エイリアスを使用すると、作業効率を向上させることができます
git config --global alias.ci commit // ciはエイリアスですcommitは元のコマンドです
git config --global alias.co checkout
git config --globalalias.brブランチ
コマンドを使用してgitエイリアスを表示する
git config --list | grepエイリアス
クエリログのヒント:
git config --global alias.lg "log --color --graph --pretty = format: '%Cred%h%Creset-%C(yellow)%d%Creset%s%Cgreen(%cr)%C(太字の青)<%an>%Creset '-abbrev-commit "
エイリアスをキャンセル
git config --global --unset alias.br
エイリアス構成ファイルを表示する
cat /root/.gitconfig
[root @ jinkai newfile] #git config --global alias.ci commit
[root @ jinkai newfile] #git config --global alias.co checkout
[root @ jinkai newfile] #git config --globalalias.brブランチ
[root @ jinkai newfile] #git config --list | grepエイリアス
alias.ci =コンマ
alias.co = checkout
alias.br = branch
[root @ jinkai newfile] #git config --global alias.lg "log --color --graph --pretty = format: '%Cred%h%Creset-%C(yellow)%d%Creset%s%Cgreen (%cr)%C(太字の青)<%an>%Creset '-abbrev-commit "
[root @ jinkai newfile] #git lg
* f2828c2-(HEAD、タグ:v1.0、origin / main、origin / admin、main、admin)メインファイルa.txt(21時間前)<root
* 7baca4e-メインファイルa.txt(21時間前)<root>
| \
| * 3445592-管理ファイルa.txt(21時間前)<root>
-------------------------------------------------- -----
[root @ jinkai newfile] #git config --global --unset alias.br
[root @ jinkai newfile] #git config --list | grepエイリアス
alias.ci =コンマ
alias.co = checkout
alias.lg = log --color --graph --pretty = format: '%Cred%h%Creset-%C(yellow)%d%Creset%s%Cgreen(%cr)%C(bold blue)<% an>%Creset '-abbrev-commit
[root @ jinkai newfile] #cat /root/.gitconfig
[ユーザー]
名前=ルート
[押す]
デフォルト=マッチング
[エイリアス]
ci =コミット
co =チェックアウト
lg = log --color --graph --pretty = format: '%Cred%h%Creset-%C(yellow)%d%Creset%s%Cgreen(%cr)%C(bold blue)<%an> %Creset '-abbrev-commi
gitサーバーを構築する
結局のところ、githubは公開されており、プライベートウェアハウスを購入する必要があります。だから私たちは、私たちの会社だけが使用するプライベートなものを構築する方法を見つけることができます。Gitlabは良い選択です。それを紹介する前に、コマンドラインgitサーバーについて話しましょう
サーバーを見つけるには、最初にgitをインストールし、yum install -ygitをインストールします
gitユーザーを追加し、シェルを/ usr / bin / git-shellに設定します。目的は、gitユーザーがリモートでログインできないようにすることです。
useradd -s / usr / bin / git-shell git
cd / home / git
authorized_keysファイルを作成し、所有者、グループ、およびアクセス許可を変更して、クライアントマシンに公開鍵を保存します
mkdir .ssh
.ssh / authorized_keysをタッチします
chown -R git:git .ssh
chmod 600 .ssh / authorized_keys
/ data / gitrootなど、gitリポジトリが保存されているディレクトリを特定します
mkdir / data / gitroot
cd / data / gitroot
git init --bare sample.git //ベアウェアハウスが作成されます。サーバー上のGitウェアハウスは純粋に共有用であるため、ベアウェアハウスにはワークスペースがありません。そのため、ユーザーはサーバーに直接ログインして変更することはできません。ワークスペース、およびGitリポジトリは通常.gitで終わります
chown -R git:git sample.git
上記の操作はgitサーバーで行われます。通常、gitサーバーは開発者がコードを変更するためにログインする必要はありません。githubと同様にサーバーとしてのみ機能します。通常の操作は独自のPCで行われます。
まず、クライアントの公開鍵をgitサーバーの/home/git/.ssh/authorized_keysファイルに配置します
クライアント(自分のPC)でリモートウェアハウスのクローンを作成します
git clone git @ ip:/data/gitroot/sample.git
この時点で、現在のディレクトリにサンプルディレクトリを生成できます。これは、クローンを作成したリモートです。
倉庫が出ています。これを入力すると、コードを開発してからリモートにプッシュするか、サーバーからクライアントにクローンを作成できます。
[root @ jinkai05〜] #yum install -y git
[root @ jinkai05〜] #useradd -s / usr / bin / git-shell git
[root @ jinkai05〜] #cd / home / git /
[root @ jinkai05 git] #mkdir .ssh
[root @ jinkai05 git] #touch .ssh / authorized_keys
[root @ jinkai05 git] #chown -R git:git .ssh
[root @ jinkai05 git] #chmod 600 .ssh / authorized_keys
[root @ jinkai05 git] #mkdir / data / gitroot
[root @ jinkai05 git] #cd!$
cd / data / gitroot
[root @ jinkai05 gitroot] #git init --bare sample.git
/data/gitroot/sample.git/にある空のGitリポジトリを初期化します
[root @ jinkai05 gitroot] #chown -R git:git sample.git /
[root @ jinkai05 gitroot] #vim /home/git/.ssh/authorized_keys
[root @ jinkai05 gitroot] #cat!$
cat /home/git/.ssh/authorized_keys
SSH-RSA AAAAB3NzaC1yc2EAAAADAQABAAACAQDsGH9A1mo0IRXhrBsWO9Zpkv45nJT14tYQhPt6BEN / 17VPESvHVP0Ur0cVIG571Nh1yyCcLBzInDsR4UVRrexUp6j7NNXv9qA / 89DomYFp3W67WLch2fa4WkX2xeKxoZR0RJpnQK0NS5EOhe9vrI5aAJe / OsVOfMoHB8HJI / rPsS9mLmOG + PVSmQzokF4DYRmOXB / + eZ0H0Rwoy8W87WF269yliaQQMPsGgJK + 1kYhqIkEk80fEE6kGd1ZR0gSLoYYXrmSVhOhLis3TKGQLe4UqpuuV95MFmcaT1yvUVnuAqNRjmxs / hia6htySbGibcF4OmjKQU + ZFh2q + Sk1Xx147OsiT3w9WPd + QQTHvDWlN1QyPER7elSf65mcuX8QFz1WB / GV + sQの+ qNwd + 9C2xV5WtacD + 1 / QU6XQOD48mKl3VbazJoZ8K0DTYmqsm + J9Y2QuuXQ8iLBNH0zvxh3zBGpdd140q8VitAxbGA98aiXURA2D + jatlEZKMmKPlCu4JuGdsTsTex + NA9 + WI0 / PthfIkzcDjMFNoRHMkMhBJfTz2t / bOW4EgDBni0JrP66JHIMg9s2QN0O1fRtEQzcimT3FpndhYDgrM4b1G + 4K41oE + rj9tAe7sVSG2afxbDY4p53988Oze9lxPwPE2 + JT8z + ztRlfCRZqm0o3
[root @ jinkai newfile] #git clone [email protected]:/data/gitroot/sample.git
'サンプル'へのクローン作成...
ホスト「192.168.111.140(192.168.111.140)」の信頼性を確立できません。
ECDSAキーのフィンガープリントはSHA256:GnZadcz8FK3PLcgNXjhMWbz0Qgqi2LvbqaoR + wLdV9Qです。
ECDSAキーのフィンガープリントはMD5:00:10:2a:88:19:39:d4:58:7d:7a:22:0d:03:bb:82:0aです。
接続を続行してもよろしいですか(はい/いいえ)?はい
警告:既知のホストのリストに「192.168.111.140」(ECDSA)を恒久的に追加しました。
警告:空のリポジトリのクローンを作成したようです。
[root@jinkai newfile]# ls
1.txt README.mda.txtサンプル
[root @jinkaiサンプル] #echo aaaaa> a.txt
[root @jinkaiサンプル] #git add a.txt
[root @jinkaiサンプル] #git commit -m "ch a.txt"
[マスター(ルートコミット)d75b190] ch a.txt
1つのファイルが変更され、1つの挿入(+)
作成モード100644a.txt
[root @jinkaiサンプル] #git push
共通の参照はなく、指定もありません。何もしない。
おそらく、「master」などのブランチを指定する必要があります。
致命的:リモートエンドが予期せずハングアップしました
エラー:一部の参照を「[email protected]:/data/gitroot/sample.git」にプッシュできませんでした
[root @jinkaiサンプル] #git push origin master
オブジェクトのカウント:3、完了。
オブジェクトの書き込み:100%(3/3)、199バイト| 0バイト/秒、完了。
合計3(デルタ0)、再利用0(デルタ0)
[email protected]:/data/gitroot/sample.gitへ
* [新しいブランチ]マスター->マスター
[root @ jinkaiサンプル] #cd / tmp /
[root @ jinkai tmp] #git clone [email protected]:/data/gitroot/sample.git
'サンプル'へのクローン作成...
リモート:オブジェクトのカウント:3、完了。
リモート:合計3(デルタ0)、再利用0(デルタ0)
オブジェクトの受信:100%(3/3)、完了。
[root @ jinkai tmp] #ls sample /
a.txt
[root @ jinkai tmp] #cat sample / a.txt
aaaaa