分佈式代碼管理工具Git

  別人的總結是別人,本身學習完要有本身的心得體會。git

  Git是 分佈式 版本控制系統,無論能夠管控代碼,其餘類型的文件也同樣能夠進行版本控制,很方便多人協做的狀況。有點相似與如今的 WPS在線文檔 ,是不過WPS是實時的,而Git至關於在線下作完在上傳線上,達到一樣的效果。github

  所謂分佈式管理,就是代碼的管理不依賴於中心服務器,每臺終端均可以是代碼服務器,這樣極大下降了代碼丟失的風險。shell

1、Git安裝配置

  工欲善其事必先利其器,相對於windows系列的下一步下一步的安裝,咱們着重看下Ubuntu環境下的Git安裝與配置吧。【GitHub示例windows

1. Git安裝

## 哈哈,很簡單!
sudo apt-get install git
複製代碼

2. Git版本庫配置

# 建立倉庫repository目錄
mkdir MySpace
cd MySpace
touch test.txt
touch test.doc


# 初始化倉庫,而後這個倉庫下的全部文件都會被git監視
git init
ls -ah
# 將文件添加到暫存區stage
git add test.txt test.doc  # 或 git add .
# 將文件提交到倉庫,-m 後面是提交的備註信息
git commit -m "add test.txt file"
# 上面兩步能夠合併成一步操做,它會自動跟蹤並提交有修改的文件;通常不推薦這種方法,由於它不能將文件添加到git管理裏的
git commit -a "add test.txt file"


# 先GitHub推送須要先添加ssh-keygen
cd ~/.ssh
ssh-keygen
cat ~/.ssh/id_rsa.pub


# 將倉庫裏的數據提交到遠程倉庫(如:GitHub)
# GitHub中https://github.com/new新建遠程倉庫
# 將本地倉庫與遠程倉庫關聯
git remote add origin git@github.com:Crisimple/test_repository.git
# 把本地庫的全部內容推送到遠程庫上
git push -u origin master  # 首次向遠程倉庫推送加-u


# 從遠程庫克隆數據
git clone git@github.com:crisimple/test_repository.git
git clone https://github.com/crisimple/test_repository.git      # 速度慢每次推送還得輸入口令,不建議使用
複製代碼

2、後悔藥

來自廖大大的博客圖片
GitHub示例

1. 版本回退

# 1.版本回退
# 1.1. 查看提交日誌
git log
# 簡化輸出信息
git log --pretty=oneline
# 查看每一次的提交記錄,即便是回退的也能夠查看
git reflog
# -----------------------------------------------------------------------
# 1.2. 回退版本
# 回退到上一個版本
git reset --hard HEAD^
# 回退到指定的版本
git reset --hard commit_id
# 撤銷到暫存區
git reset --soft HEAD@{1}
# 幹掉這個修改
git reset --hard HEAD@{1}  # 或 git reset HEAD~2
複製代碼

2. 工做區

# 2.1 查看工做區的狀態
git status
# 2.2 丟棄工做區的文件
git checkout -- test.txt
# 2.3 刪除文件
git rm test.txt
複製代碼

3、分支管理

  在多人協做的項目中,爲了不本身開發的代碼與其餘人產生衝突,拉出一個分支。安全

  建立一個屬於本身的分支,別人看不到,還繼續在原來的分支上正常工做,而在本身的分支上幹活,先提交就提交,直到開發完畢後,再一次性合併到原來的分支上,這樣即安全又不影響別人工做。bash

1. 建立與合併分支

  HEAD指向master(也就是當前分支),master指向提交。服務器

# 建立dev分支,而後切換到dev分支,至關於接下來的兩條命令
git checkout -b dev

git branch dev
git checkout dev

# 查看當前分支,當前分支前會標一個 * 號
git branch

# 切換到主分支,這時候查看master分支上是沒有任何修改的
git checkout master

# 將dev分支上的工做成果合併到master上, git merge 用於合併指定分支到當前分支
git merge dev

# 合併完dev分支,就能夠刪除dev分支了
git branch -d dev

# git中更科學的切換分支用 switch
git switch master
# 建立並切換到新的分支上
git switch -c dev

複製代碼

  由於建立、合併和刪除分支很是快,因此Git鼓勵你使用分支完成某個任務,合併後再刪掉分支,這和直接在master分支上工做效果是同樣的,但過程更安全。app

2. BUG分支

  軟件開發中,bug就像是屢見不鮮同樣。每一個無論均可以經過一個新的臨時分支來修復,修復後合併分支,而後將臨時分支刪除。ssh

# 建立新的臨時分支的時候,看下當前工做區的狀態
git status
# 若是當前分支dev上的功能還沒開發完畢,那麼又須要緊急修復bug,能夠將dev的修改存儲起來
git stash
git status

# 肯定是在那個分支上修復bug,若是是master分支上修復則從master上建立臨時分支
git checkout master
git checkout -b issue-101

# 修復bug
git add modify_bug.py
git commit -m "fix issue 101"

# 修復完bug切換到master分支,合併bug分支,再刪除issue-101分支
git checkout master
git merge --no-ff -m "merge bug fix 101" issue-101

# 恢復 dev 分支的工做進度
git checkout dev
git status
# 查看剛存儲的開發工做
git stash list
# 恢復stash裏的內容
# git stash apply恢復後,stash內容並不刪除,經過git stash drop刪除
git stash apply stash@{0}
git stash drop
# 或者經過git stash pop 恢復的同時會將stash內容刪除
git stash pop

# cherry-pick命令,將複製一個特定的提交到當前分支
git cherry-pick commit_id
複製代碼

3. Feature分支

  添加一個新的功能時,爲了避免把主分支搞亂。沒添加一個新功能,最好新建一個feature分支,再上面開發完成後,合併,最後刪除該feature分支。分佈式

# 建立並切換至feature分支
git checkout -b feature-vulcan

# 在feature分支開發
git add feature_test.py
git commit -m "add feature vulann"

# 切換到dev,合併分支
git status
git checkout dev 
git merge feature-vulcan
# 忽然間接到說該功能不用添加了
git branch -D feature-vulcan
複製代碼

4. 多人協做

  以你們共同從GitHub上拉取代碼開發合併爲例。

# 推送分支
git push origin dev

# 抓取分支
git pull git@github.com:crisimple/crisimple.git

# 本地dev分支上開發,必須建立遠程origin的dev分支到本地
git checkout -b dev origin/dev

# 查看遠程庫信息,使用git remote -v;

# 本地新建的分支若是不推送到遠程,對其餘人就是不可見的;

# 從本地推送分支,使用git push origin branch-name,若是推送失敗,先用git pull抓取遠程的新提交;

# 在本地建立和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;

# 創建本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;

# 從遠程抓取分支,使用git pull,若是有衝突,要先處理衝突。
複製代碼

5. 解決衝突

4、標籤管理

  發佈一個版本時,一般先在版本庫中打一個標籤(tag),這樣就惟一肯定了打標籤時刻的版本。未來不管何時,取某個標籤的版本就把那個標籤使勁兒的歷史版本取出來便可。因此標籤也是版本庫的一個快照,其實它就是指向commit的指針。

  Git有commit,爲何還要引入tag?簡化記憶,commit對應id太長,用tag v1.1容易記住且有名字有意義。

1. 建立標籤

# 切換到要打標籤的分支上
git branch
git checkout master

# 打一個新標籤
git tag v1.0
# 查看已打過的全部標籤
git tag
# 對指定的commit id打標籤
git log --pretty=oneline --abbrev-commit
git tag v1.1 f53c633
# 查看標籤信息
git show v1.1
# 打標籤帶參數,-a 指定標籤名,-m 指定說明文字
git tag -a v1.2 -m "parameter introduction add"
複製代碼

2. 操做標籤

# 刪除標籤
git tag -d v1.1
# 將某個標籤的推送到遠程
git push origin v1.0
# 一次性推送所有還沒有推送到遠程的本地標籤
git push origin --tags
# 刪除遠程的標籤
git push origin :refs/tags/v1.2
複製代碼

5、自定義Git

1. 忽略特殊文件

  在git工做區的根目錄下建立一個特殊的.gitignore文件,而後把要忽略的文件名填進去,git就會自動忽略這些文件。

echo "要忽略文件的名稱" >> .gitignoer

# 檢查忽略規則
git check-ignore -v app.py

# 強制添加某個文件
git add -f app.py
複製代碼

2. 配置別名

  簡化git的相關命令,能夠給原名令起個別名。

git config --global alias st status

# 配置查看最後一次提交信息
git config --global alias last 'log -i'

# 加上config是針對當前用戶生效,若是不加只針對當前的倉庫起做用
# 當前倉庫的配置文件
cat .git/config
# 當前用戶的配置文件
cat .gitconfig
複製代碼

6、搭建Git服務器

  搭建一套本身的git代碼管理倉庫。

# 安裝git
sudo apt-get install git

# 建立一個git用戶,用來運行git服務
sudo adduser git

# 建立證書登陸
收集全部須要登陸的用戶的公鑰,就是他們本身的id_rsa.pub文件,把全部公鑰導入到/home/git/.ssh/authorized_keys文件裏,一行一個。

# 初始化倉庫
sudo git init --bare sample.git

# 不讓用戶直接登陸到服務器上去改工做區,而且服務器上的Git倉庫一般都以.git結尾。而後,把owner改成git
sudo chown -R git:git sample.git

# 禁用 shell 登陸
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

# 克隆遠程倉庫
git clone git@server:/srv/sample.git
複製代碼
相關文章
相關標籤/搜索