Git

2019/12/11更新
git config --system --unset credential.helper 重新輸入賬號密碼
credential: 證明,證件

2019/8/9更新:git rebase ,git cherry-pick

(一) 簡介

Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒有之一)。

(1) 集中式和分布式

  • 集中式版本控制系統(tǒng):
    集中式版本控制系統(tǒng),版本庫是集中存放在中央服務(wù)器的
    集中式版本控制系統(tǒng)最大的毛病就是必須聯(lián)網(wǎng)才能工作

  • 分布式版本控制系統(tǒng) :
    分布式版本控制系統(tǒng)根本沒有“中央服務(wù)器”
    分布式版本控制系統(tǒng)的安全性要高很多,比如服務(wù)器掛了,不容任何影響

(2) 安裝

(1) 官網(wǎng)下載https://git-scm.com/download/win

(2) 在命令行輸入


$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"



------------------------

注意git config命令的--global參數(shù),表示你這臺機(jī)器上所有的Git倉庫都會使用這個(gè)配置

當(dāng)然也可以對某個(gè)倉庫指定不同的用戶名和Email地址。

(3) 配置好用戶名和郵箱后,可以通過 git config --list 來查看所有配置

(3) 創(chuàng)建版本庫

(1) 什么是版本庫:

  • 版本庫又名倉庫,英文名repository,你可以簡單理解成一個(gè)目錄,這個(gè)目錄里面的所有文件都可以被Git管理起來,每個(gè)文件的修改、刪除,Git都能跟蹤,以便任何時(shí)刻都可以追蹤歷史,或者在將來某個(gè)時(shí)刻可以“還原”。
  • repository是倉庫的意思

(2) 創(chuàng)建一個(gè)版本庫:

(1) 創(chuàng)建文件夾
$ mkdir aa
$ cd aa
$ pwd


// mkdir: 創(chuàng)建文件夾 ( make )
// rmdir: 刪除文件夾 ( remove )

// touch filename: 在工作區(qū)添加文件 ( 比如:touch one.txt )
// rm filename: 在工作區(qū)刪除文件 ( 比如:rm one.txt )

// cd: 進(jìn)入文件夾 ( change )
// pwd: 用于顯示當(dāng)前目錄

// pwd是print working directory的縮寫

如果你使用Windows系統(tǒng),為了避免遇到各種莫名其妙的問題,請確保目錄名(包括父目錄)不包含中文。

(2) 通過 git init 命令把這個(gè)目錄變成Git可以管理的倉庫
  • 執(zhí)行 git init 后,可以發(fā)現(xiàn)當(dāng)前目錄下多了一個(gè).git的目錄,這個(gè)目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個(gè)目錄里面的文件
  • 如果 .git 目錄被隱藏了,可以通過 ls -ah (ls-a ls-ah) 命令來查看
  • ls -a 顯示所有的文件,包括隱藏文件(以.開頭的文件) -a 是 all 的意思

$ git init


ls :是list的意思
a  :是all的意思


ls  : 只顯示非隱藏的文件夾。

ls -a : 顯示所有文件和文件夾,包括隱藏文件和文件夾

ls -al:顯示所有文件和文件夾,包括隱藏文件和文件夾,并顯示大小,屬組,創(chuàng)建時(shí)間等詳細(xì)信息
(3) 把文件放入git倉庫
  • (1) 在git倉庫中新建文件,或者復(fù)制過來
  • (2) 用命令 git add 告訴Git,把文件添加到倉庫暫存區(qū)
  • (3) 用命令 git commit 告訴Git,把文件提交到倉庫,把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支
$ git add readme.txt

$ git commit -m "xxxx"


--------------------------------

git commit命令,-m后面輸入的是本次提交的說明

  • 為什么Git添加文件需要add,commit一共兩步呢?因?yàn)閏ommit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."


--------------------------
$ git add *   添加所有文件到倉庫








(4) 倉庫狀態(tài)

git status命令可以讓我們時(shí)刻掌握 -- 倉庫當(dāng)前的狀態(tài)
git diff 命令可以讓我們時(shí)刻掌握 -- 具體修改了什么內(nèi)容

( diff是 difference 的縮寫 )
( modified 是修改的意思 )
( untracked 未被追蹤 )

(5) git diff 用于比較兩次修改的差異

  • 比較工作區(qū)與暫存區(qū)
git diff 不加參數(shù)即默認(rèn)比較工作區(qū)與暫存區(qū)
  • 比較工作區(qū)與當(dāng)前分支
git diff HEAD -- 工作區(qū)的文件名

例如: git diff HEAD -- one.txt    // 比較 工作區(qū)的one.txt 和 當(dāng)前分支中的 one.txt

(6) 提交修改

提交修改和提交新文件是一樣的兩步,第一步是git add,再運(yùn)行g(shù)it status看看當(dāng)前倉庫的狀態(tài),第二步是 git commit,再運(yùn)行g(shù)it status看看當(dāng)前倉庫的狀態(tài)


小結(jié):

要隨時(shí)掌握工作區(qū)的狀態(tài),使用git status命令。

如果git status告訴你有文件被修改過,用git diff可以查看修改內(nèi)容。

(7) git log

git log ---- 查看git的commit信息,每次提交的信息包括注視在內(nèi),從最新提交到最久提交

  • git log --pretty=oneline 命令-------------- // 將commit 信息簡化成一行顯示
  • git log --graph命令可以看到分支合并圖。 -------------( graph是圖表的意思 )

(8) git reset 版本回退

HEAD 表示當(dāng)前版本
HEAD^ 表示上一個(gè)版本
HEAD^^ 表示上上一個(gè)版本
HEAD~100 退回到相對于當(dāng)前版本的上 100 個(gè)版本去

$ git reset --hard HEAD^   返回上一個(gè)版本


或者:

$ git reset --hard ( commit id )  返回指定版本    // id不需要寫全

(9) git reflog 查看到之前的版本的commit id

git reflog 查看到之前的版本的commit id

  • 關(guān)閉窗口后,仍然有效
  • 在退回到舊版本之后可以查看舊版本之前的提交日志
  • 當(dāng)我們想從一個(gè)舊版本退回到新版本但是我們關(guān)閉了shell窗口,不能查看之前的commit id了,就可以通過 $ git reflog 查看到之前的版本的commit id
總結(jié):


HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id。

穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個(gè)版本。

要重返未來,用 git reflog 查看命令歷史,以便確定要回到未來的哪個(gè)版本。


(10) cat命令 ----用于讀取文件的內(nèi)容并進(jìn)行輸出

  • cat 是concatenate 的縮寫,鏈接的意思
$ cat readme.txt  // 讀取readme.txt文件的內(nèi)容,并輸出到命令行








(11) 工作區(qū)和暫存區(qū)

Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個(gè)分支master,以及指向master的一個(gè)指針叫HEAD。

git版本庫中有很多東西,最重要的是下面三個(gè):

  • 暫存區(qū) stage
  • 第一個(gè)分支 master
  • 指向master分支的指針 HEAD

git add把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū);
git commit提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。

  • cmd命令 創(chuàng)建文件one.txt 并寫入內(nèi)容 one content
(1) 新建文件one.txt
> one.txt


(2) 新建文件one.txt 并且 寫入內(nèi)容 “one content”
echo one content > one.txt

  • touch命令 在工作區(qū)新建文件
touch one.txt
git add 和 git commit








(12) 管理修改

Git管理的是修改,當(dāng)你用git add命令后,在工作區(qū)的第一次修改被放入暫存區(qū),準(zhǔn)備提交,但是,在工作區(qū)的第二次修改并沒有放入暫存區(qū),所以,git commit只負(fù)責(zé)把暫存區(qū)的修改提交了,也就是第一次的修改被提交了,第二次的修改不會被提交。

  • 每次修改,如果不add到暫存區(qū),那就不會加入到commit中。

(13) 撤銷修改

git checkout -- filename 撤銷工作區(qū)的修改

  • git checkout -- filename 的作用是把filename文件在工作區(qū)的修改撤銷到最近一次git add 或 git commit時(shí)的內(nèi)容

  • 一種是readme.txt自修改后還沒有被放到暫存區(qū),現(xiàn)在,撤銷修改就回到和版本庫一模一樣的狀態(tài);

  • 一種是readme.txt已經(jīng)添加到暫存區(qū)后,又作了修改,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。

  • checkout是校驗(yàn)的意思

  • git checkout -- file命令中的--很重要,沒有--,就變成了“切換到另一個(gè)分支”的命令

總之,就是讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)。

git reset HEAD filename 撤銷暫存區(qū)的修改,重新放回工作區(qū)


總結(jié):

場景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容,想直接丟棄工作區(qū)的修改時(shí),用命令`git checkout -- filename`。


場景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容,還添加到了暫存區(qū)時(shí),想丟棄修改,分兩步,
第一步用命令`git reset HEAD filename`,就回到了場景1,
第二步按場景1操作。


場景3:已經(jīng)提交了不合適的修改到版本庫時(shí),想要撤銷本次提交。
git reset HEAD^

(14) 刪除文件

rm filename 刪除工作區(qū)文件

git rm filename 刪除版本庫中的文件

  • (1) rm filename 刪除工作區(qū)的 文件
  • (2) 然后 git status 會提示工作區(qū)文件被刪除
  • 接下來
  • (3) 如果要從版本庫中刪除該文件,那就用命令git rm刪掉,并且git commit
  • (4) 如果要還原工作區(qū)刪除前的狀態(tài) git checkout -- filename 還原到git add 或者 git commit最近一次的狀態(tài)









(二) 遠(yuǎn)程倉庫

--- 托管遠(yuǎn)程倉庫 github
由于你的本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,所以,需要一點(diǎn)設(shè)置

第1步:創(chuàng)建SSH Key。

在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個(gè)目錄下有沒有id_rsa和id_rsa.pub這兩個(gè)文件,如果已經(jīng)有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創(chuàng)建SSH K

  • $ssh-keygen -t rsa -C "youremail@example.com"
  • $ssh-keygen -t rsa -C "youremail@example.com" -f ~/.ssh/filename 生成多個(gè)ssh-key

用 Git Bash 輸入以下命令:

---
$ ssh-keygen -t rsa -C "youremail@example.com"
---


---
如果需要創(chuàng)建多個(gè)ssh key 的話

$ssh-keygen -t rsa -C 'youremail@example.com' -f ~/.ssh/filename    

// ( !!!!不加-f filename就會覆蓋 )
---


-t 指定密鑰類型,默認(rèn)是 rsa ,可以省略。
-C 設(shè)置注釋文字,比如郵箱。
-f 指定密鑰文件存儲文件名。

你需要把郵件地址換成你自己的郵件地址,然后一路回車,使用默認(rèn)值即可,

由于這個(gè)Key也不是用于軍事目的,所以也無需設(shè)置密碼

ssh-keygen 用于為 ssh(1) 生成、管理和轉(zhuǎn)換認(rèn)證密鑰,包括 RSA 和 DSA 兩種密鑰。

  • 如果一切順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個(gè)文件,這兩個(gè)就是SSH Key的秘鑰對,
  • id_rsa是私鑰,不能泄露出去,
  • id_rsa.pub是公鑰,可以放心地告訴任何人。

第2步:登陸GitHub

  • 打開“Account settings”,“SSSH and GPG keys”頁面:
  • 然后,點(diǎn)“New SSH key”,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容:
  • 點(diǎn)“Add SSH Key”,你就應(yīng)該看到已經(jīng)添加的Key:

為什么GitHub需要SSH Key呢?因?yàn)镚itHub需要識別出你推送的提交確實(shí)是你推送的,而不是別人冒充的,而Git支持SSH協(xié)議,所以,GitHub只要知道了你的公鑰,就可以確認(rèn)只有你自己才能推送。

當(dāng)然,GitHub允許你添加多個(gè)Key。假定你有若干電腦,你一會兒在公司提交,一會兒在家里提交,只要把每臺電腦的Key都添加到GitHub,就可以在每臺電腦上往GitHub推送了。
http://blog.csdn.net/binyao02123202/article/details/20130891




(三) 添加遠(yuǎn)程庫

現(xiàn)在的情景是,你已經(jīng)在本地創(chuàng)建了一個(gè)Git倉庫后,又想在GitHub創(chuàng)建一個(gè)Git倉庫,并且讓這兩個(gè)倉庫進(jìn)行遠(yuǎn)程同步,這樣,GitHub上的倉庫既可以作為備份,又可以讓其他人通過該倉庫來協(xié)作

第一步:點(diǎn)擊+號,new repository 新建倉庫

第二步:填寫 repository 倉庫名稱,和描述

第三步:執(zhí)行以下代碼

git remote add origin https://github.com/woow-wu/git.git

第四布:把本地庫的所有內(nèi)容推送到遠(yuǎn)程庫上:

git push -u origin master


// git push -u origin master

// 表示把本地的master分支推送到origin主機(jī)master分支,同時(shí)指定origin為默認(rèn)主機(jī)

// -u選項(xiàng)會指定一個(gè)默認(rèn)主機(jī),這樣后面就可以不加任何參數(shù)使用git push。

由于遠(yuǎn)程庫是空的,我們第一次推送master分支時(shí),加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來,在以后的推送或者拉取時(shí)就可以簡化命令。

$ git push -u origin master 上面命令將本地的master分支推送到origin主機(jī),同時(shí)指定origin為默認(rèn)主機(jī),后面就可以不加任何參數(shù)使用git push了。

不帶任何參數(shù)的git push,默認(rèn)只推送當(dāng)前分支,這叫做simple方式。此外,還有一種matching方式,會推送所有有對應(yīng)的遠(yuǎn)程分支的本地分支。Git 2.0版本之前,默認(rèn)采用matching方法,現(xiàn)在改為默認(rèn)采用simple方式。

git push origin 分支名 ------ 將該分支推送到github

git push origin --delete 分支名 ------ 刪除遠(yuǎn)程分支

git branch -d 分支名 ------ 刪除本地當(dāng)前分支xxx


git remote add origin .........   // 添加遠(yuǎn)程庫origin


git remote rm origin           // 刪除已有的GitHub遠(yuǎn)程庫


git push origin 分支名 ------  將該分支推送到 github 的 origin倉庫 的 xx分支



--------------------------------------------------

git push origin --delete 分支名  ------ 刪除遠(yuǎn)程分支


git push origin  :分支名  ------ 刪除github遠(yuǎn)程分支 
(這種方法是推送一個(gè)空分支到遠(yuǎn)程,其實(shí)就相當(dāng)于刪除遠(yuǎn)程分支)

--------------------------------------------------



git branch -a ------ 查看本地和遠(yuǎn)程分支,遠(yuǎn)程分支用紅色表示





git push

git push 命令:把本地庫的內(nèi)容推送到遠(yuǎn)程,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程。

-u

  • -u選項(xiàng)會指定一個(gè)默認(rèn)主機(jī),這樣后面就可以不加任何參數(shù)使用git push。




(四) 從遠(yuǎn)程庫克隆

git clone

要克隆一個(gè)倉庫,首先必須知道倉庫的地址,然后使用git clone命令克隆。
Git支持多種協(xié)議,包括https,但通過ssh支持的原生git協(xié)議速度最快。

git clone https://github.com/woow-wu/git3.git











分支管理

分支的作用

你創(chuàng)建了一個(gè)屬于你自己的分支,別人看不到,還繼續(xù)在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發(fā)完畢后,再一次性合并到原來的分支上,這樣,既安全,又不影響別人工作。

主分支

每次提交,Git都把它們串成一條時(shí)間線,這條時(shí)間線就是一個(gè)分支。截止到目前,只有一條時(shí)間線,在Git里,這個(gè)分支叫主分支,即master分支。HEAD嚴(yán)格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當(dāng)前分支。

  • HEAD指向當(dāng)前分支
  • master分支 是 主分支

創(chuàng)建分支

(1) git chechout -b 分支名 ------------創(chuàng)建 并 切換 分支

  • git checkout
git checkout -b 分支名

// git checkout -b dev
  • -b參數(shù) 表示創(chuàng)建并切換,相當(dāng)于下面兩條命令
$ git branch dev
$ git checkout dev

(2) git branch ------------查看本地分支

git branch  ---------- 查看本地分支

git branch -r ------- 查看遠(yuǎn)程分支

git branch -a ------- 查看本地和遠(yuǎn)程分支所有分支  (遠(yuǎn)程分支用紅色標(biāo)記,本地當(dāng)前分支用綠色標(biāo)記 )

git branch命令查看當(dāng)前分支

  • git branch命令會列出所有分支,當(dāng)前分支前面會標(biāo)一個(gè)*號。

(3) git branch 分支名 ------------創(chuàng)建分支

  • (1) 用git branch 新分支名時(shí),需要在本地有commit時(shí),才會成功
  • (2) 用git checkout -b 新分支名時(shí),本地沒有commit時(shí),也會成功

(4) git branch -d 分支名 ------------刪除本地分支

(5) git branch -D 分支名------------強(qiáng)行刪除分支

(6) git checkout 分支名 ------------切換分支

(7) git merge 指定分支名 ------------合并指定分支到當(dāng)前分支

  • merge 是融入,合并的意思
  • Fast-forward信息,Git告訴我們,這次合并是“快進(jìn)模式”,也就是直接把master指向dev的當(dāng)前提交,所以合并速度非???。
查看分支:git branch

創(chuàng)建分支:git branch <name>

切換分支:git checkout <name>

創(chuàng)建+切換分支:git checkout -b <name>

合并某分支到當(dāng)前分支:git merge <name>

刪除分支:git branch -d <name>

https://blog.zengrong.net/post/1746.html

分支

解決沖突

當(dāng)Git無法自動合并分支時(shí),就必須首先解決沖突。解決沖突后,再提交,合并完成。

用git log --graph命令可以看到分支合并圖。
  • graph 是圖表的意思


分支管理策略

git merge --no-ff -m "merge with no-ff" dev

  • git merge --no-ff -m "merge with no-ff" dev : 表示將目標(biāo)分支 dev 合并到 當(dāng)前分支上,并強(qiáng)制禁用 Fast forward模式,并且提交 commit ,提交說明是 “merge with no-ff”
  • 請注意--no-ff參數(shù),表示禁用Fast forward
  • 為什么要禁用 Fash forward : 因?yàn)镕ast forward模式下,刪除分支后,會丟掉分支信息
  • 合并分支時(shí),加上--no-ff參數(shù)就可以用普通模式合并, 合并后的歷史有分支,能看出來曾經(jīng)做過合并,而fast forward合并就看不出來曾經(jīng)做過合并。
  • 如果要強(qiáng)制禁用Fast forward模式,Git就會在merge時(shí)生成一個(gè)新的commit,這樣,從分支歷史上就可以看出分支信息
  • 因?yàn)楸敬魏喜⒁獎?chuàng)建一個(gè)新的commit,所以加上-m參數(shù),把commit描述寫進(jìn)去。

git log --graph --pretty=oneline --abbrev-commit

  • --graph 分支合并圖
  • --pretty=oneline 合并到一條信息
  • -- abbrev-commit :縮寫commit id,僅顯示 SHA-1 的前幾個(gè)字符,而非所有的 40 個(gè)字符
  • abbrev 是縮寫的意思
$ git merge --no-ff -m "merge with no-ff" dev

// --no--ff 表示禁用 Fast forward

// 為什么要禁用 Fash forward : 因?yàn)镕ast forward模式下,刪除分支后,會丟掉分支信息

// 因?yàn)楸敬魏喜⒁獎?chuàng)建一個(gè)新的commit,所以加上-m參數(shù),把commit描述寫進(jìn)去




---------------------------------------------

$ git log --graph --pretty=oneline --abbrev-commit

// --graph  分支合并圖

// --pretty=oneline 合并到一條信息

// -- abbrev-commit  :縮寫commit id,僅顯示 SHA-1 的前幾個(gè)字符,而非所有的 40 個(gè)字符

// abbrev 是縮寫的意思

在實(shí)際開發(fā)中,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:

首先,master分支應(yīng)該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本,平時(shí)不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是說,dev分支是不穩(wěn)定的,到某個(gè)時(shí)候,比如1.0版本發(fā)布時(shí),再把dev分支合并到master上,在master分支發(fā)布1.0版本;

你和你的小伙伴們每個(gè)人都在dev分支上干活,每個(gè)人都有自己的分支,時(shí)不時(shí)地往dev分支上合并就可以了。

合并分支時(shí),加上--no-ff參數(shù)就可以用普通模式合并

合并后的歷史有分支,能看出來曾經(jīng)做過合并,而fast forward合并就看不出來曾經(jīng)做過合并。



Bug分支

git stash

Git還提供了一個(gè)stash功能,可以把當(dāng)前工作現(xiàn)場“儲藏”起來,等以后恢復(fù)現(xiàn)場后繼續(xù)工作

  • stash 是隱藏的意思

git stash list

  • 查看之前隱藏的工作現(xiàn)場

如何恢復(fù)之前隱藏的工作現(xiàn)場

(1) git stash apply---------恢復(fù)后,stash內(nèi)容不刪除

-----------------------------------需要用git stash drop刪除

  • 一是用git stash apply恢復(fù),但是恢復(fù)后,stash內(nèi)容并不刪除,你需要用git stash drop來刪除;

(2) git stash pop---------恢復(fù)后,stash內(nèi)容也刪除了

  • 另一種方式是用git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪了

修復(fù)bug時(shí),我們會通過創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并,最后刪除;

當(dāng)手頭工作沒有完成時(shí),先把工作現(xiàn)場git stash一下,然后去修復(fù)bug,修復(fù)后,再git stash pop,回到工作現(xiàn)場。




Feature分支

添加一個(gè)新功能時(shí),你肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼,把主分支搞亂了,所以,每添加一個(gè)新功能,最好新建一個(gè)feature分支,在上面開發(fā),完成后,合并,最后,刪除該feature分支。

git branch -D <name>強(qiáng)行刪除




多人協(xié)作

git remote ------- 查看遠(yuǎn)程庫的信息

git remote -v ------- 查看遠(yuǎn)程庫詳細(xì)信息


$ git remote -v
origin  https://github.com/woow-wu/git.git (fetch)
origin  https://github.com/woow-wu/git.git (push)


上面顯示了可以抓取和推送的origin的地址。

如果沒有推送權(quán)限,就看不到push的地址。

$ git push origin master

$ git push origin dev


master分支是主分支,因此要時(shí)刻與遠(yuǎn)程同步;

dev分支是開發(fā)分支,團(tuán)隊(duì)所有成員都需要在上面工作,所以也需要與遠(yuǎn)程同步;

bug分支只用于在本地修復(fù)bug,就沒必要推到遠(yuǎn)程了,除非老板要看看你每周到底修復(fù)了幾個(gè)bug;

feature分支是否推到遠(yuǎn)程,取決于你是否和你的小伙伴合作在上面開發(fā)。----------------------新功能分支










創(chuàng)建標(biāo)簽

git tag ------------ 查看所有標(biāo)簽

git tag <name> ------------ 打一個(gè)新標(biāo)簽

git show <tagname> ------------ 查看標(biāo)簽信息

  • 還可以通過-s用私鑰簽名一個(gè)標(biāo)簽:
$ git tag -s v0.2 -m "signed version 0.2 released" fec145a









2018/3/27更

vim命令

(1) vim 文件名 ----------------- 用vim打開文件

vim b.txt         // 用vim打開 b.txt 文件

(2) 打開文件后,按 a, i 或 o 進(jìn)入編輯模式

 會在底部命令行顯示        --插入--

(3) ESC 推出編輯模式,回退到命令模式

在編輯模式下按下ESC 鍵,回退到命令模式

(4) 在命令模式下輸入 :q 和 :wq 和 :q! 和 :w

:w 保存

:q  退出



:wq 保存并退出

:q! 不保存并退出



:w! 強(qiáng)行保存 






2018/4/4更

git log 如何退出

q 鍵

在 英文狀態(tài)下 按 q 鍵 ----------- 可以退出 git log 顯示的 commit 記錄
git log --pretty=oneline    // 精簡模式

git log -n                  // 只顯示前 n 條 commit log

git log --stat -n           // 顯示前 n 條 commit log,并顯示每次提交文件的相關(guān)數(shù)據(jù)統(tǒng)計(jì)

git log --graph             // 用圖形顯示log,可以看到分支合并情況
git log --pretty=format:"%an %.."        // 控制顯示的記錄格式



選項(xiàng)   說明
%H  提交對象(commit)的完整哈希字串
%h  提交對象的簡短哈希字串
%T  樹對象(tree)的完整哈希字串
%t  樹對象的簡短哈希字串
%P  父對象(parent)的完整哈希字串
%p  父對象的簡短哈希字串
%an 作者(author)的名字
%ae 作者的電子郵件地址
%ad 作者修訂日期(可以用 -date= 選項(xiàng)定制格式)
%ar 作者修訂日期,按多久以前的方式顯示
%cn 提交者(committer)的名字
%ce 提交者的電子郵件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式顯示
%s  提交說明
命令可以組合使用

git log --graph
git log -n
git log --pretty=oneline


git log --graph --pretty=oneline -3

git log --graph --pretty=oneline -3 --abbrev-commit    ( abbrev是縮寫的意思 )

版本回退

每次( commit )的記錄可以通過 ( git log ) 查看
通過 commit id 就可以回退版本 ------> 工作區(qū)的文件就能和某次提交commit文件時(shí)的文件一致


git reset --hard HEAD^        // 回退到上一個(gè)版本
git reset --hard HEAD^^       // 回退到上上個(gè)版本
git reset --hard HEAD~3       // 回退到往上的第三個(gè)版本      即上上上個(gè)版本

git reset --hard commit id    // 回退到指定commit id 的版本

git reflog

當(dāng)關(guān)掉電腦后 git log 沒有記錄就可以用 git reflog 來打印提交記錄

git reflog     // 查看命令歷史
  • 生成多個(gè)ssh-key
ssh-keygen -t rsa -C '郵箱' -f ~/.ssh/filename

git 新建分支時(shí)要注意

(1) 用git branch 新分支名時(shí),需要在本地有commit時(shí),才會成功
(2) 用git checkout -b 新分支名時(shí),本地沒有commit時(shí),也會成功




(重要)

如果遠(yuǎn)程分支A上有修改 ( 或者別人有push ),而對應(yīng)的本地分支A也有修改,這時(shí)候 git push origin A 就會報(bào)錯,如Updates were rejected because the remote contains work that you do not have locally. This is usually caused by another repository pushing to the same ref. You may want to first integrate the remote changes(e.g., 'git pull ...') before pushing again.原因就是其他本地庫有push內(nèi)容到遠(yuǎn)程相同的分支,( 或者首次是 readme文件在本地沒有,而遠(yuǎn)程有 )
-------解決辦法是-------
git pull
在push之前,先執(zhí)行 git pull 拉取遠(yuǎn)程分支內(nèi)容到本地,然后如果有 conflict 就先解決沖突,然后在push到遠(yuǎn)程
  • conflict 沖突
  • integrate 整合,融合



本地分支關(guān)聯(lián)遠(yuǎn)程分支


$ git branch --set-upstream-to <remote>/<branch> <localbranch>


// 例如:  $ git branch --set-upstream-to origin/dev dev


查看遠(yuǎn)程庫信息,使用 git remote -v;



本地新建的分支如果不推送到遠(yuǎn)程,對其他人就是不可見的;



從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠(yuǎn)程的新提交;



在本地創(chuàng)建和遠(yuǎn)程分支對應(yīng)的分支,
使用git checkout -b branch-name origin/branch-name,本地和遠(yuǎn)程分支的名稱最好一致;



建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián),使用git branch --set-upstream branch-name origin/branch-name;



從遠(yuǎn)程抓取分支,使用git pull,如果有沖突,要先處理沖突。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Git 是目前最流行的分布式版本控制系統(tǒng)之一。 版本控制指的是,記錄每次版本變更的內(nèi)容和時(shí)間等細(xì)節(jié),保留各版本之間...
    神齊閱讀 1,515評論 0 7
  • 以下筆記主要參考gitgot,大致了解git使用和原理。 第一部分我們從個(gè)人的視角去研究如何用好Git,并且揭示G...
    carolwhite閱讀 2,526評論 0 1
  • 一、基本概念: 注:對于git的分布式概念及其優(yōu)點(diǎn),不重復(fù)說明,自己百度或谷歌。本文中涉及到指令前面有$的,在cm...
    大廠offer閱讀 1,558評論 0 3
  • 簡介 Git是一個(gè)開源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大的項(xiàng)目。 Git 與常用的版本控制工具 ...
    閩越布衣閱讀 2,875評論 0 18
  • Add & Commit git init 初始化一個(gè) Git 倉庫(repository),即把當(dāng)前所在目錄變成...
    冬絮閱讀 5,132評論 0 9

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