多人協作,你需要會的Git操作指南

前言

很多大型公司多人協作,代碼都採用Git進行集中管理,我個人所在公司也是如此,覺得多熟悉一些會對工作有幫助。

文章內容主要包含以下幾方面

  1. Git 簡介
  2. 安裝Git
  3. 創建版本庫(Git命令的使用)
  4. 代碼版本的管理
  5. 倉庫分支的理解
  6. 標籤管理

內容:Git簡介

  1. 概念:Git是最先進的分佈式版本控制系統;
  2. 歷史:

linus 在1991年創建了開源的Linux ,linus堅定反對CVS和SVN,認爲與Linux的開源精神不符合, 之後的代碼迭代中選擇了商業版Bitkeeper(東家BitMover),被授權免費使用這個版本控制系統。 但後來開源社區牛人破解Bitkeeper協議,東家生氣收回Linux社區免費使用權, Linus兩週寫了Git版本控制系統。
集中式 vs 分佈式

內容:安裝Git

  • Linux安裝Git ,Git命令; 或者 sudo apt -get install git
  • Mac OS安裝, 通過homebrew安裝,或者xcode download Command Line Tools

內容:創建版本庫(命令的使用)

 $ git init 

瞬間 Git倉庫建好了,並且是一個空的倉庫,目錄下多了一個.git的目錄,跟蹤管理版本庫的。 可用 $ ls -ah 命令看見;

$ git add  readme.txt
$ git commit -m “wrote a readme file “ (-m輸入的本次提交的說明)
$ git status : 讓我們隨時掌握倉庫當前的狀態
$ git diff : 查看文件的不用之處

內容:版本的回退機制,管理修改,撤銷修改,刪除

  • Git當中,每次文件修改到一定程度的時候,都可以“保存一個快照”,這個快照被稱作commit. 如果誤刪了文件,還可以從最近的一個commit恢復。
$ git log :  查看文件的改動,顯示從最近到最遠的提交日誌
  如果嫌輸出信息太多,可以使用參數
   $ git log --pretty=oneline

  • commit id : 十六進制的,採用SHA1計算出來的一個非常大的數字,避免衝突。
  • Git當中 HEAD表示當前版本,上一個版本就是HEAD^ ,上上一個版本就是 HEAD ^ ^ , 往上100個版本寫成 HEAD~100
  • Git內部有個指向當前版本的HEAD指針,當你回退版本的時候,Git修改指針指向
回退到上一個版本:
$ git reset --hard HEAD^   (--hard參數意義?)

回退成功可查看文件比如: 
$ cat   a.txt

指定回到未來的某個版本:
$ git reset --hard 36233332(數字代表commit id)

恢復了又後悔了怎麼辦? 找不到 commit id ?
$ git reflog   記錄每一次的命令,可以找到 commit id

工作區和暫存區

  • 工作區(working Directory): 電腦裏能看到的目錄;
  • 版本庫(Repository): 工作區有一個隱藏目錄.git,不算工作區,而是Git的版本庫; Git版本庫最重要的是稱爲state(或者index)的暫存區,還有git自動創建的第一個分支master,以及指向master的一個指針HEAD。

如圖:


121121.png

提交的文件修改通常放到暫存區,然後,一次性提交暫存區的所有修改。
Git管理的是修改,git add 命令後,工作區的第一次修改被放入了暫存區,準備提交,但是第二次修改沒有放入暫存區,git commit 只負責把暫存區的修改提交了。

$ git diff HEAD -- a.txt
查看工作區和版本庫裏面最新版本的區別

撤銷修改:


 1. a.txt 還沒有放到暫存區,撤銷修改就回到和版本庫一模一樣的狀態;
 2. a.txt已經添加到暫存區,又作了修改,撤銷修改就回到添加到暫存區後的狀態
 回到最近一次git commit 或者 git add時 的狀態
 
 
//未添加到暫存區
 $ git checkout -- a.txt
 把a.txt文件在工作區的修改全部撤銷 ( -- 符號很重要,如果沒有,變成了切換到另一個分支的命令了)
//已經添加到暫存區(2步)
 $ git reset HEAD a.txt (git reset 既可以回退版本,也可以把暫存區修改回到工作區,用HEAD時,表示最新的版本);
 $ git checkout -- a.txt
 

刪除文件:

一般情況下:
1. $ rm a.txt
2. git status 告訴工作區和版本庫不一致了;

如果要從版本庫當中刪除:
$ git rm a.txt
$ git commit -m "remove a.txt"

誤刪了本地文件,從版本庫裏面恢復:
$ git checkout --a.txt


內容:倉庫,分支的概念

遠程倉庫:

  • 添加遠程庫:
$ git remote add origin [email protected]:../leargit.git
遠程庫的名字叫做origin

把本地庫的內容推送到遠程,用 $git push 命令,是把當前分支master推送到遠程;
$ git push -u origin master
 -u 會關聯本地master分支和遠程的master分支

接下來提交:
 $git push origin master

  • 從遠程庫克隆
$ git clone https://........git
$ git clone git://github.com:........git

git 支持多種協議
git:// 使用SSH 這種協議的速度最快;
https:

分支管理

  • 創建與合併分支
    git 把每次提交都串成一條時間線,時間線就是一個分支,默認一個master主分支.HEAD不是指向提交,而是指向master,所以HEAD指向的就是當前分支。
    當我們創建新的分支,比如dev時,Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上。
    假如我們在dev工作完成了,可以把dev合併到master上, 合併方式是把master指向dev的當前提交,完成合並;

    git分支合併.jpg

  • 命令

1.$ git checkout -b dev  :創建dev分支,切換到dev分支


 相當於以下兩條命令
$git branch dev      $ git checkout dev

$git checkout master : 切換回主分支 

2. 查看當前分支
$ git branch 

3. 合併分支

$git merge dev : 用於合併指定分支到當前分支。
 注意合併模式是“快進模式” : Fast-forward ,也就是直接把master 指向 dev 的當前提交;
 
4. 禁用FF
$git merge --no-ff -m "no ff" dev

5. 刪除分支
合併完了過後,可以刪除 dev分支了
$git branch -d dev

  • 解決衝突

git無法自動合併分支時,首先需要解決衝突,再提交,合併完成

$git log --graph : 可以查看分支合併圖

分支策略

  • master 分支時非常穩定的,僅用來發布新版本,平時不能在上面幹活。幹活都在dev分支上。發佈1.0版本時,再把dev分支合併到master分支發佈1.0版本;

  • Bug分支:
    每個bug都可以通過一個新的臨時分支來修復,修復後,合併分支,然後將臨時分支刪除
    git 的stash功能,可以把當前工作現場儲藏起來,等以後恢復現場後繼續工作

1. $git stash : 保存當前的工作到dev分支上面

2.  $git checkout master : 準備在master上面修復bug;
    $git checkout -b issue: 創建issue分支修復bug;

3. $git add a.txt     $git commit -m "fix bug":提交修復的文件


4. 切換到master分支,並完成合並,最後刪除issue分支
  $git checkout master
  $git merge --no-ff -m "merge bug fix " issue
  $ git branch -d issue

5.回到dev幹活:
  $git checkout dev
  $git status (當前工作區是乾淨的)
  
  $git stash list  查看保存的工作現場
  
6.恢復之前的工作現場:
   第一種: $git stash apply      $git stash drop (調用後手動刪除stash內容)
   第二種: $git stash pop (自動刪除stash內容)
   其他: 可以多次stash,恢復的時候,恢復到指定的stash
   $git stash list
   $git stash apply stash@{0}

  • Feature分支:添加一個新功能時,最好新建一個feature分支,在上面開發,完成後合併,最後刪除feature分支
$git branch -D feature
強行刪除分支feature

多人協作
從遠程克隆時,git自動把本地的master分支和遠程的master分支對應起來了,並且,遠程倉庫的默認名稱是origin

$git remote  查看遠程庫的信息
或者 $git remote -v 


  • 推送分支:

master分支是主分支,要時刻與遠程同步
dev分支是開發分支,也需要同步
bug分支只用於本地修復的bug,沒必要推送到遠程
feature分支取決於是否合作開發

$git push origin master : git把該分支推送到遠程庫對應的遠程分支上

$git push origin dev : 推送其他分支
  • 抓取分支
$git pull :從遠程拉取
如需設置本地分支與遠程分支的鏈接,採用
$git branch --set-upstream dev origin/dev
  • 多人協作的模式:
  1. 試圖git push origin branch-name推送自己的修改
  2. 先用git pull試圖合併
  3. 如果合併有衝突,解決衝突,本地提交
  4. 衝突解決後,git push origin branch-name

內容: 標籤管理

  • 發佈一個版本時,通常在版本庫打一個標籤。取某個標籤的版本,對應某個時刻的快照。
$git tag v1.0 : 打一個新標籤

$git tag : 查看所有標籤

$git tag v0.9 32323(commit id):給某次的提交打標籤

$git show v0.9 : 查看標籤信息

$git tag -d v0.1 :刪除某個標籤

  • 自定義Git

$git config --global color.ui true : git顯示顏色

  • 忽略特殊文件

在git工作區的根目錄下創建一個特殊的.gitignore文件,把忽略的文件名填進去,git會自動忽略這些文件;
.gitignore文件本身要放到版本庫裏,並且可以對.gitignore做版本管理

  • 配置文件

每個倉庫的Git配置文件都放在.git/config文件中

$cat .git/config 

$cat .gitconfig:當前用戶的配置文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章