git

Git資料整理

在這里,我整理的并不是很多,大家可以稍微借鑒一下就好,git命令用得好可以偷點(diǎn)懶罷了。

操作流程

一圖勝千言,你常用的幾個(gè)命令大概就是這樣的。這是阮一峰給出的樣子:

image.jpg

官方git-scm是這樣的:
image.png

只表明了一般的git本地操作流程: 1. 在工作目錄中修改文件 2. 暫存文件,將文件的快照放入暫存區(qū)域 3. 提交更新,找到暫存區(qū)域的文件,將快照永久性存儲(chǔ)到git倉庫目錄

命令清單

配置

.gitconfig配置文件,可以是電腦上的全局配置,或者項(xiàng)目目錄下的項(xiàng)目配置 git config --list用于查看全局配置 我電腦上是log出:

credential.helper=osxkeychain
user.email=nanci_guo@xinyan.com
user.name=guonanci
push.default=matching
alias.s=status
alias.t=tag
alias.ck=checkout
alias.cm=commit
alias.ps=push
alias.pl=pull
alias.d=diff
alias.l=log
alias.rs=reset
alias.rv=revert
alias.m=merge
alias.unstage=reset HEAD --
alias.last=log -1 HEAD
url.https://.insteadof=git://
last.unstage=log -1 HEAD
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
remote.origin.url=git@gitlab.xinyan.com:spider/SDK_H5.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

你們?cè)趙indows也試試,大致應(yīng)該差不多

增加刪除文件

# 添加指定文件/目錄到暫存區(qū)
$ git add [file1] [dir1] [file2] ...

代碼提交

git commit -m [msg]是提交暫存區(qū)到倉庫區(qū),git commit [file1] [dir1] [file2] ... -m [msg]是提交暫存區(qū)的指定文件到倉庫區(qū),git commit -a是提交工作區(qū)自上次commit之后的變化,直接到倉庫區(qū),git commit --amend -m [msg]是使用一次新的commit,替代上一次提交,如果代碼沒有任何變化,則用來改寫上一次commit的提交信息,`git commit –amend [file1] [file2]是重做一次commit,并包括指定文件的新變化,其實(shí)如果不太注重commit message的話,–amend這個(gè)標(biāo)志位幾乎沒什么用了。

分支

// 列出所有本地分支
git branch
// 列出所有遠(yuǎn)程分支
git branch -r
// 列出所有本地和遠(yuǎn)程分支
git branch -a
// 新建一個(gè)分支,但依然停留在當(dāng)前分支
git branch [new-branch-name]
// 從指定分支新建一個(gè)分支,切換到新分支,與同名遠(yuǎn)程分支建立追蹤關(guān)系
git checkout -b [new-branch-name] [base-branch-name:可選] && git push -u origin [new-branch-name]
// 合并指定分支到當(dāng)前分支
git merge [branch-to-merge]
// 刪除本地和遠(yuǎn)程的同名分支, 
git branch -d [branch-name] && git push origin :[branch-name]

查看信息

// 顯示有變更的文件
git status
// 顯示暫存區(qū)和工作區(qū)的差異
git diff
// 顯示工作區(qū)和當(dāng)前分支最新commit之間的差異
git diff HEAD
// 顯示指定文件的每一行代碼是誰在哪個(gè)時(shí)間改過,信息有點(diǎn)多哦。。
git blame [file]

遠(yuǎn)程同步

// 下載遠(yuǎn)程倉庫的所有變動(dòng)
git fetch [remote]
// 顯示所有遠(yuǎn)程倉庫
git remote -v
// 顯示某個(gè)遠(yuǎn)程倉庫的信息
git remote show [remote]
// 增加一個(gè)新的遠(yuǎn)程倉庫,并命名
git remote add [shortname] [url]
// 取回遠(yuǎn)程倉庫的變化,并與本地分支合并
git pull [remote] [branch]
// 上傳本地指定分支到遠(yuǎn)程倉庫
git push [remote] --force
// 推送所有遠(yuǎn)程分支到遠(yuǎn)程倉庫
git push [remote] --all 

撤銷

// 恢復(fù)暫存區(qū)的指定文件到工作區(qū),我經(jīng)常用
git checkout [file1] [dir1] ... 
// or 
git checkout .
// 重置暫存區(qū)的指定文件,與上一次的commit保持一致,但工作區(qū)不變
git reset [file]
// 重置當(dāng)前分支的HEAD為指定commit,同時(shí)重置暫存區(qū)與工作區(qū),與指定commit保持一致
git reset --hard [comit-log]

// 新建一個(gè)commit,用來撤銷指定commit,后者的所有變化都被前者抵消,并且應(yīng)用到當(dāng)前分支
git revert [commit]

git 遠(yuǎn)程操作

git clone,git remote

// ssh,https,git,本地協(xié)議都支持,git協(xié)議下載最快
git clone [版本庫url] [本地目錄名:可選]

// git remote 用于管理主機(jī)名,不帶選項(xiàng)的時(shí)候,git remote列出所有遠(yuǎn)程主機(jī)

git remote // origin 
// -v 選項(xiàng)可以查看主機(jī)網(wǎng)址
git remote -v
origin git@gitlab.xinyan.com:spider/SDK_H5.git (fetch)
origin git@gitlab.xinyan.com:spider/SDK_H5.git (push) 

// 克隆版本庫的時(shí)候,所使用的遠(yuǎn)程主機(jī)自動(dòng)被git命名為origin,如果想用其他的主機(jī)名,需要用git clone命令的-o選項(xiàng)指定
git remote -o jQuery htttps://github.com/jquery/jquery.git
git remote
jQuery

// 可以查看該主機(jī)的詳細(xì)信息
git remote show <host-name> 
// 添加
git remote add <host-name> <url>

// 刪除
git remote rm <host-name>
// 改名
git remote rename <old-name> <new-name>

git fetch

一旦遠(yuǎn)程主機(jī)的版本庫有了commit更新, 需要將這些更新取回本地,用到git fetch <remote-host> git fetch命令通常用來查看其他人的進(jìn)程,因?yàn)樗』氐拇a對(duì)你本地的開發(fā)代碼沒有影響。默認(rèn)情況下,git fetch取回所有分支的更新。如果只想取回特定分支的更新,可以指定分支名:git fetch <remote-host> <branch-name>。所取回的更新,需要在本地主機(jī)上用<q style="-webkit-print-color-adjust: exact;">遠(yuǎn)程主機(jī)名/分支名</q>的形式讀取。

git pull

取回遠(yuǎn)程主機(jī)某個(gè)分支的更新,再與本地的指定分支合并git pull <remote-host> <remote-branch>:<local-branch>。如果遠(yuǎn)程分支與當(dāng)前分支合并,則冒號(hào)后面的部分可以省略:

git pull origin next

git fetch origin
git merge origin/next

在某些場(chǎng)合,git會(huì)自動(dòng)在本地分支和遠(yuǎn)程分支之間,建立追蹤關(guān)系tracking,比如在git clone的時(shí)候,所有本地分支默認(rèn)與遠(yuǎn)程主機(jī)的同名分支建立追蹤關(guān)系 也允許手動(dòng)建立追蹤關(guān)系:git branch --set-upstream master origin/next 如果當(dāng)前分支遠(yuǎn)程分支存在追蹤關(guān)系,git pull就可以省略遠(yuǎn)程分支名:git pull origin,如果當(dāng)前分支只有一個(gè)追蹤分支,連遠(yuǎn)程主機(jī)名都可以省略:git pull,上面命令表示,當(dāng)前分支自動(dòng)與唯一一個(gè)追蹤分支進(jìn)行合并。

如果遠(yuǎn)程主機(jī)刪除了某個(gè)分支,默認(rèn)情況下git pull的時(shí)候不會(huì)在拉取遠(yuǎn)程分支的時(shí)候刪除對(duì)應(yīng)的本地分支,是為了防止由于其他人操作了遠(yuǎn)程主機(jī)導(dǎo)致git pull不知不覺刪除了本地分支,當(dāng)然可以加上選項(xiàng) -p就會(huì)在本地刪除遠(yuǎn)程已經(jīng)刪除的分支:

git pull -p 
// or 
git fetch --prune origin
git fetch -p

git push

用于將本地分支的更新推送到遠(yuǎn)程主機(jī),格式與git pull命令相仿:

git push <remote-host> <local-branch>:<remote-branch>

分支推送的順序是<from>:<to>,git pull對(duì)應(yīng)<remote-branch>:<local-branch>git push對(duì)應(yīng)<local-branch>:<remote-branch>,如果省略遠(yuǎn)程分支名,則表示將本地分支推送與之存在“追蹤關(guān)系”的遠(yuǎn)程分支(通常兩者同名),如果該遠(yuǎn)程分支不存在,則會(huì)被新建。git push origin master,上面命令表示將本地的master分支推送到origin主機(jī)的master分支。 如果省略本地分支名,則表示刪除指定的遠(yuǎn)程分支,等同于推送一個(gè)空的本地分支到遠(yuǎn)程分支。

git push origin :master
// or 
git push origin --delete master

如果當(dāng)前分之與遠(yuǎn)程分支之間存在追蹤關(guān)系,則本地分支和遠(yuǎn)程分支都可以省略:git push origin。 如果當(dāng)前分支只有一個(gè)追蹤分支,那么主機(jī)名都可以省略:git push

如果當(dāng)前分支與多個(gè)主機(jī)之間存在追蹤關(guān)系,則可以使用-u選項(xiàng)指定一個(gè)默認(rèn)主機(jī),這樣后面就可以不加任何參數(shù)使用git push了: git push -u origin master。不帶任何參數(shù)的git push默認(rèn)只推送當(dāng)前分支,叫做simple方式,此外還有一種matching方式 ,現(xiàn)在默認(rèn)使用simple方式,如果要修改,采用git config --global push.default matching/simple,還有就是不管是否存在對(duì)應(yīng)的遠(yuǎn)程分支,都會(huì)推送到遠(yuǎn)程主機(jī),需要使用 --all選項(xiàng):git push --all origin,如果要推送標(biāo)簽,要加上--tags選項(xiàng):git push origin --tags。

git 進(jìn)階

git 特點(diǎn)

近乎所有操作都只是本地執(zhí)行

比如說要瀏覽項(xiàng)目的歷史,git不需要外聯(lián)到服務(wù)器去獲取歷史,只需要直接從本地?cái)?shù)據(jù)庫中讀取。

git保證完整性

git中所有數(shù)據(jù)在存儲(chǔ)前都計(jì)算校驗(yàn)和,然后以校驗(yàn)和來引用。意味著不可能在git不知情時(shí)更改文件內(nèi)容或者目錄內(nèi)容。這個(gè)功能構(gòu)建在git底層。是構(gòu)成git哲學(xué)不可或缺的部分,如果在傳輸過程中丟失信息或者損壞文件,git就能發(fā)現(xiàn)。 git用以計(jì)算校驗(yàn)和的機(jī)制叫做SHA-1散列(哈希hash),他是一個(gè)由40個(gè)十六進(jìn)制字符(0-9和a-f)組成字符串,基于git中文件的內(nèi)容或者目錄結(jié)構(gòu)計(jì)算出來。

進(jìn)階部分不好整理,有點(diǎn)多,難度比較大,大家可以自己稍微看看我推薦的progit.zh.pdf 還有 git-scm中文文檔,不過說到底git只是個(gè)工具,遇到問題可以及時(shí)解決就行。

提升效率的工具方面

其實(shí)自己手打也差不多, 可以利用之前提及的git config –list里面的alias,比如: git pl && git add . && git cm -m "commit message" && git ps; && 符號(hào)是說上一條命令執(zhí)行成功才會(huì)執(zhí)行下一條 Mac上有oh-my-zsh這個(gè)很方便的命令行alias全局配置工具,還有iterm2終端app, 參考下面的文章: item2安裝及使用 oh-my-zsh安裝 oh-my-zsh配置

我在項(xiàng)目里面配置了ci.sh 和 test.sh prd.sh 可以用于日常的提交代碼,推送到test分支發(fā)布測(cè)試環(huán)境,推送到prd分支發(fā)布生產(chǎn)環(huán)境。windows的話推薦強(qiáng)大的Cygwin,這里也有一篇有關(guān)Cygwin的短文,

windows上我找到這篇文章,特別短,主要是alias方面。

不過我覺得如果你的IDE自帶終端還有g(shù)it操作比較方便的話還是用IDE吧,不用命令行也可以。 如果用命令行的話,推薦git-bash,這里有篇短文,推薦一下。

參考資料

書籍 文檔 鏈接
progit.zh.pdf git-scm.com/book 阮一峰-常用git命令清單

郭南賜 2018.06.02

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

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

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