[Git 使用] Git學(xué)習(xí)手冊

文檔標(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)程推送,那么,哪些分支需要推送,哪些不需要?

  1. master分支是主分支,因此要時刻與遠(yuǎn)程同步;
  2. dev分支是開發(fā)分支,團(tuán)隊所有成員都需要在上面工作,所以也需要與遠(yuǎn)程同步;
  3. 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.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來。這樣一來,任何一處協(xié)同...
    __silhouette閱讀 16,203評論 5 147
  • Git 命令行學(xué)習(xí)筆記 Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來...
    sunnyghx閱讀 4,155評論 0 11
  • Git常用語法 [TOC] Git簡介 描述 ? Git(讀音為/g?t/。)是一個開源的分布式版本控制系統(tǒng),...
    君惜丶閱讀 3,953評論 0 13
  • 時光飛逝,轉(zhuǎn)眼間已經(jīng)進(jìn)入2017年。想起4年前剛剛踏入大學(xué)校園,覺得畢業(yè)還那么遙遠(yuǎn),有很多時間可以揮霍,能...
    無遠(yuǎn)行至閱讀 345評論 0 0
  • 抑郁 一條蟲子爬了進(jìn)來 平靜 遲緩 默不作聲的崩潰 掙扎在死亡邊緣 它啃了一嘴 死灰
    卻悔閱讀 169評論 3 2

友情鏈接更多精彩內(nèi)容