文檔標(biāo)識:[C-180108-M-20200106]
知識來源:廖雪峰 Git教程
內(nèi)容鏈接均來源于互聯(lián)網(wǎng),如有侵權(quán),請聯(lián)系刪除。
創(chuàng)建git 用戶
- 設(shè)置用戶名稱
git config --global user.name "Name"
- 設(shè)置用戶郵箱
git config --global user.email "email@example.com"
創(chuàng)建git 倉庫
- 創(chuàng)建文件夾
mkdir folder
- 初始化倉庫
git init
添加文件至倉庫
- 添加文件至?xí)捍鎱^(qū)(stage)
git add files
- 提交修改至版本庫
git commit -m "it's a example"
- 已跟蹤文件跳過暫存直接提交修改
git commit -a -m "ignore submit stage"
版本回退與文件比對
- 查看倉庫狀態(tài)
git status
- 查看工作區(qū)與暫存區(qū)之間的修改內(nèi)容
git diff
- 查看暫存區(qū)與版本庫之間的修改內(nèi)容
git diff -cached
- 查看工作區(qū)與版本庫之間的修改內(nèi)容
git diff HEAD
- 查看提交詳細(xì)日志
git log
- 回退至以前的版本
git reset --hard HEAD^
-- HEAD 表示最新版本
-- ^ 表示上一個版本,可多次疊加
-- HEAD~10 表示最新版本往上10個版本
git reset --hard commit id
-- 可以回到指定的commit id 的版本
- 查看版本提交或回退的日志
git reflog
- 撤銷對文件做的修改
git checkout --file
- 撤銷已經(jīng)提交到暫存區(qū)的文件
git reset HEAD file
- 提交一個刪除文件到暫存區(qū)
git rm file
- 已暫存的文件使用強(qiáng)制刪除
git rm -f file
- 將文件添加到忽略文件中
git rm --cached file
遠(yuǎn)程倉庫
- 創(chuàng)建SSH密鑰
ssh-keygen -t rsa -C "email@example.com"
- 登錄GitHub后把生成的公鑰添加到賬戶設(shè)置
- 在本地添加與遠(yuǎn)程倉庫的關(guān)聯(lián)
git remote add origin git@github.com:****/LearnGit.git
origin 表示遠(yuǎn)程倉庫的名稱
git@... 表示遠(yuǎn)程倉庫的地址
- 添加關(guān)聯(lián)后,將本地倉庫推送至遠(yuǎn)程倉庫
git push -u origin master
首次連接提示警告信息,確認(rèn)指紋信息是否來自GitHub.com
The authenticity of host 'github.com (192.*.*.*)' can't be established.
RSA key fingerprint is SHA256:nThbg6*****WGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?
- 本地倉庫修改后,直接推送
git push origin master
- 從遠(yuǎn)程倉庫復(fù)制(下載)一份完整項目
mkdir clonedemo
cd clonedemo
git clone git@github.com:****/LearnGit.git
這樣在clonedemo文件夾下生成了 LearnGit 的完整項目文件
倉庫分支
- 創(chuàng)建和合并分支
git branch dev
- 創(chuàng)建dev的分支
git checkout dev
- 切換到dev分支
git checkout -b dev
- 創(chuàng)建并切換到dev分支
git branch
可查看當(dāng)前所有分支,當(dāng)前分支為帶*的
- 合并分支
git merge dev
把dev 分支合并到當(dāng)前分支
- 刪除分支
git brach -d dev
刪除dev 分支
當(dāng)分支沒有被合并時,需要強(qiáng)制刪除
git branch -D dev
沖突解決
在執(zhí)行git merge時會出現(xiàn)CONFLICT的警告,當(dāng)master 分支需要合并其他分支時,需要解決沖突后才可以合并,無切換至沖突的分支。分支管理策略
通常,合并分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支后,會丟掉分支信息。
如果要強(qiáng)制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev
Bug分支
當(dāng)分支工作未提交,需要暫時保存已暫存的文件,不影響其他分支的操作。
- 隱藏當(dāng)前工作
git stash
可以將已經(jīng)暫存的文件隱藏起來。
當(dāng)文件已修改,未暫存則無法使用stash不能隱藏。如果不使用stash,那么已修改的文件會影響其他分支的操作。
- 恢復(fù)已隱藏的工作
查看已保存的stash列表
git stash list
選擇需要恢復(fù)的工作
git stash apply stash@{0}
多人協(xié)作
- 查看遠(yuǎn)程庫信息
git remote
或者
git remote -v
顯示了可以抓取和推送的origin的地址。如果沒有推送權(quán)限,就看不到push的地址。
- 推送分支
git push origin master
并不是一定要把本地分支往遠(yuǎn)程推送,那么,哪些分支需要推送,哪些不需要?
- master分支是主分支,因此要時刻與遠(yuǎn)程同步;
- dev分支是開發(fā)分支,團(tuán)隊所有成員都需要在上面工作,所以也需要與遠(yuǎn)程同步;
- bug分支只用于在本地修復(fù)bug,就沒必要推到遠(yuǎn)程了,除非老板要看看你每周到底修復(fù)了幾個bug;
- 抓取分支
當(dāng)多人協(xié)作時,對同一分支的推送產(chǎn)生沖突,需要先解決沖突。使用以下命令獲取遠(yuǎn)程倉庫的數(shù)據(jù):
git pull
多人協(xié)作的工作模式通常是這樣:
首先,可以試圖用git push origin branch-name推送自己的修改;
如果推送失敗,則因為遠(yuǎn)程分支比你的本地更新,需要先用git pull試圖合并;
如果合并有沖突,則解決沖突,并在本地提交;
沒有沖突或者解決掉沖突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建,用命令git branch --set-upstream branch-name origin/branch-name。
分支管理
Git的標(biāo)簽本質(zhì)是版本庫的快照,與分支一樣,但是分支可以進(jìn)行移動,標(biāo)簽創(chuàng)建后無法移動,為了代替版本的commit號碼,方便記憶。
- 創(chuàng)建標(biāo)簽
快速創(chuàng)建標(biāo)簽
git tag name
顯示所有標(biāo)簽,標(biāo)簽按字母順序進(jìn)行排序。
git tag
一般標(biāo)簽的創(chuàng)建默認(rèn)是在最新的版本,當(dāng)需要補(bǔ)創(chuàng)建標(biāo)簽則需要把版本commit號碼加上,可使用git log --oneline查看,例如:
git tag v1.0 332a1d3
- 查看標(biāo)簽的詳細(xì)信息
git show v1.0
- 創(chuàng)建帶說明的標(biāo)簽
git tag -a v1.1 -m "version 1.0" 24d123f
- 創(chuàng)建帶有私鑰簽名的標(biāo)簽,簽名采用PGP簽名
git tag -s v1.1 -m "version 1.0" 24d123f
- 刪除標(biāo)簽
git tag -d v1.0
- 遠(yuǎn)程推送某個標(biāo)簽到遠(yuǎn)程倉庫
git push origin v1.0
- 遠(yuǎn)程推送所有標(biāo)簽到遠(yuǎn)程倉庫
git push origin --tags
- 遠(yuǎn)程刪除標(biāo)簽,需要先刪除本地標(biāo)簽后,在執(zhí)行以下命令:
git push origin:refs/tags/v1.0
刪除后顯示如下:
To github.com:****/LearnGit.git
- [deleted] v1.0
注意:這里的標(biāo)簽一般指的就是版本,在github上的可以看到標(biāo)簽被放在releases一般。
自定義git
- 忽略不需要提交的文件
在git工作區(qū)下面創(chuàng)建.gitignore文件,把需要忽略的文件名填入。
忽略文件的原則是:
忽略操作系統(tǒng)自動生成的文件,比如縮略圖等;
忽略編譯生成的中間文件、可執(zhí)行文件等,也就是如果一個文件是通過另一個文件自動生成的,那自動生成的文件就沒必要放進(jìn)版本庫,比如Java編譯產(chǎn)生的.class文件;
忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件。
在github上有適合各類語言環(huán)境的gitignore文件,可以下載使用:
https://github.com/github/gitignore
例如python工作環(huán)境下的配置:
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
...
#符號開頭的為注釋,可以在文件內(nèi)填入文件夾或指定后綴的文件名。
如果在忽略文件內(nèi)的文件,使用git add命令添加,那么會提示文件被忽略不被提交。如果確實需要添加,則需要使用以下命令:
git add -f file
檢查某類文件是否在忽略文件內(nèi),則可以使用以下命令檢查:
git check-ignore -v file
- 配置別名
git config --global alias.st status
這樣使用git st就可以代替git status 使用。
當(dāng)使用git config時,加了--global指的是對當(dāng)前所有倉庫生效,如果不加則對當(dāng)前倉庫生效。
- 查看倉庫配置
cat .git/config
當(dāng)前用戶的Git配置放在用戶主目錄的隱藏文件.gitconfig文件內(nèi),windows系統(tǒng)下放在用戶目錄(“文檔” 文件夾的上一級)里。
搭建git服務(wù)器
第一步,安裝git:
sudo apt-get install git
第二步,創(chuàng)建一個git用戶,用來運(yùn)行g(shù)it服務(wù):
sudo adduser git
第三步,創(chuàng)建證書登錄:
收集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub文件,把所有公鑰導(dǎo)入到/home/git/.ssh/authorized_keys文件里,一行一個。
第四步,初始化Git倉庫:
先選定一個目錄作為Git倉庫,假定是/srv/sample.git,在/srv目錄下輸入命令:
sudo git init --bare sample.git
Git就會創(chuàng)建一個裸倉庫,裸倉庫沒有工作區(qū),因為服務(wù)器上的Git倉庫純粹是為了共享,所以不讓用戶直接登錄到服務(wù)器上去改工作區(qū),并且服務(wù)器上的Git倉庫通常都以.git結(jié)尾。然后,把owner改為git:
sudo chown -R git:git sample.git
第五步,禁用shell登錄:
出于安全考慮,第二步創(chuàng)建的git用戶不允許登錄shell,這可以通過編輯/etc/passwd文件完成。找到類似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改為:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
這樣,git用戶可以正常通過ssh使用git,但無法登錄shell,因為我們?yōu)間it用戶指定的git-shell每次一登錄就自動退出。
第六步,克隆遠(yuǎn)程倉庫:
現(xiàn)在,可以通過git clone命令克隆遠(yuǎn)程倉庫了,在各自的電腦上運(yùn)行:
git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.