Git 學(xué)習(xí)小結(jié)及命令匯總

安裝:

windows安裝git-- msysgit是windows版的git,下載單獨(dú)的.exe按照默認(rèn)選項(xiàng)安裝即可? 在開始菜單找git-->git bash,會跳出命令行窗口,表示安裝成功。輸入命令git config --global user.name“你的名字” gitconfig --global user.email“你的郵箱”進(jìn)行設(shè)置

創(chuàng)建版本庫(repository):

? ? mkdir 要創(chuàng)建的目錄名

? ? cd 要創(chuàng)建的目錄名

? ? pwd -->這個命令是顯示當(dāng)前目錄的

? ? git init -->把目錄變成git可管理的倉庫,此時看到路徑有.git,若沒有,可能默認(rèn)隱藏了,通過ls -ah命令可以看到


添加文件:

? ? git add文件名-->添加文件,回車后窗口并沒有給什么反應(yīng)

? ? git commit -m“本次說明”-->把文件提交到倉庫,-m后面輸入的是本次提交的說明

? ? 另外說明:為什么需要add和commit兩步呢?因?yàn)閏ommit可以一次提交多個文件

例如:gitadd file1.txt

? ? ? ? ? ?git add file2.txt file.txt

? ? ? ? ? ?git commit -m“add 3 file.”


時光機(jī)穿梭:

git status -->若更改文件內(nèi)容,可以通過這個命令查看當(dāng)前狀態(tài),是否被修改了,修改后是否提交

git diff文件名-->可以查看根據(jù)命令輸出看到哪里做了修改 修改后提交的步驟依然是add commit,在commit之前運(yùn)行status看一下當(dāng)前倉庫狀態(tài)

git status -->可以看到要提交的包括剛剛修改的文件,然后commit一下,繼續(xù)status

git status -->會告訴我們沒有需要提交的修改,工作目錄是干凈的(working directory clean)

git log -->查看提交的歷史記錄,從最近到最遠(yuǎn)的方式顯示

git log --pretty=oneline -->看到的一長串是commit

id(版本號),是SHA1計算出來的用十六進(jìn)制表示的數(shù)字

時光機(jī):

git reset --hard HEAD^ -->回退到上一個版本

cat文件名-->查看當(dāng)前版本的內(nèi)容,看一下是不是我們要回退的這個版本,此時log已經(jīng)看不到最新那個版本記錄

git reset --hard最新版本的前幾位commit id -->回到最新版本,如果找的多個版本號,cat一下看看內(nèi)容 不要忘記git commit

git reflog -->可以查看每一次命令的commit id

工作區(qū)(working directory)和暫存區(qū)(stage):

add是把工作區(qū)文件添加進(jìn)暫存區(qū),commit是從暫存區(qū)到分支上(版本庫包括暫存區(qū)和分支),必須先add到暫存區(qū),才能commit到分支上


撤銷修改:

git checkout --文件名-->在工作區(qū)的修改全部撤銷,一是修改后還沒有add到暫存區(qū),就回到和版本庫一樣的狀態(tài),就是回到最近一次commit的狀態(tài);一是已經(jīng)add暫存區(qū),又做了修改,是回到add暫存區(qū)的狀態(tài),就是最近一次add的狀態(tài)。

git reset HEAD文件名-->把暫存區(qū)的修改撤銷(unstage),重新回到工作區(qū),checkout--文件名丟棄工作區(qū)的修改

gitreset命令既可以回退版本,也可以把暫存區(qū)的修改回退到工作區(qū)。當(dāng)用HEAD時,表示最新版本。

刪除文件:

rm文件名-->在工作區(qū)刪除一個已經(jīng)提交了的文件,現(xiàn)在是版本庫和工作區(qū)不一致,status可以看到哪些被刪了:

一是確定是要刪掉這個文件,

? ? git rm

?? ?git commit-->通過這兩個命令,文件就從版本庫中刪除了

一是刪錯了的情況,由于此時版本庫里還有這個文件

? ? git checkout --文件名-->現(xiàn)在就是回到最近的版本庫狀態(tài)了


遠(yuǎn)程倉庫:(用github為例)

git常用命令

1,首先需要SSH KEY(在用戶主目錄下.ssh文件夾下有id_ras(私鑰)和id_ras.pub(公鑰)),沒有的話,打開Git Bash創(chuàng)建ssh-keygen -t rsa -C“你的郵箱”,然后一路回車

2,登錄github,打開account setting,ssh keys頁面,點(diǎn)擊add ssh key,填上任意title,在key里粘貼id_ras.pub文件的內(nèi)容,然后點(diǎn)擊add key。(需要ssh是因?yàn)間ithub需要識別推送的消息是否是你推送的)在github上創(chuàng)建倉庫,Create a new repo-->在repository name填寫倉庫名,其他地方默認(rèn),create repository,添加成功在新的界面可以看到github給的信息:可以從這個倉庫克隆新的倉庫,也可以與已有的本地倉庫進(jìn)行關(guān)聯(lián),把本地倉庫的內(nèi)容push到github倉庫。

我們在本地倉庫運(yùn)行如下命令:

git remote add origin git@github.com:github賬戶名/倉庫名.git

--> git對遠(yuǎn)程庫默認(rèn)的叫法--origin

下一步把本地內(nèi)容推送到遠(yuǎn)程:

git push -u origin master-->git push是把當(dāng)前分支master推送到遠(yuǎn)程。由于當(dāng)前遠(yuǎn)程是空的,第一次推送時加上了-u的參數(shù),git會把本地master和遠(yuǎn)程master關(guān)聯(lián)起來,后續(xù)的推送和拉取就可以簡化命令。

git push origin master-->后續(xù)就可以通過這個命令從本地進(jìn)行提交

git push origin HEAD: 遠(yuǎn)程分支名 -->本地分支名和遠(yuǎn)程分支名不同的情況下用的命令(你必須在要push的本地分支上)

SSH警告:

第一次使用clone或者push命令連接github時會有警告,

警告

這是因?yàn)镾SH在第一次驗(yàn)證github服務(wù)器的key時,需要確認(rèn)gtithub的key指紋信息是否為來自github服務(wù)器,輸入yes即可,然后github反饋給你一個把key添加到本機(jī)的信任列表里了的警告,繼續(xù)yes(在輸入之前可以對照github的RAS key的指紋信息是否與SSH連接給出的一致)。

從遠(yuǎn)程克隆倉庫:在github創(chuàng)建一個新的倉庫,需要勾選Initialize this repository with a README,這樣github會自動創(chuàng)建一個README.md文件。

git clone git@github.com:github賬號名/工程名.git-->把倉庫克隆到本地

cd倉庫名-->把git庫的地址切換成自己的

ls -->查看本地存在的文件。(git支持多種協(xié)議,包括https(速度慢,每次推送都必須輸入口令),ssh)


分支管理:

創(chuàng)建與合并分支--》HEAD指向master(當(dāng)前分支),master指向提交,

git checkout -b分支名-->創(chuàng)建一個新的分支,-b(branch)表示創(chuàng)建并切換,相當(dāng)于兩條命令,

git branch -->會列出所有分支進(jìn)行查看,在當(dāng)前分支前加*。

git checkout master-->回到master分支上

git merge要合并分支名-->用于合并指定分支到當(dāng)前分支

git branch -d分支名-->刪除分支

git branch -f指定分支名要移動到的分支--》把指定的分支名移動到要移動的分支去

git reset local^/ git reset HEAD~1--》都是撤回本地分支local到它的父部

git revert HEAD --》撤回遠(yuǎn)程分支最近提交的信息重新生成這個分支

git cherry-pick <commit1><commit2><...>--》如果你想將一些提交復(fù)制到你當(dāng)前HEAD位置下,這是很直接的推進(jìn)方式

git rebase -i HEAD~4 --》是指當(dāng)前分支位置并包含當(dāng)前位置往父部共4個位置進(jìn)行一個界面化交互的操作

交互命令

git commit --amend --》提交修改,在當(dāng)前分支重新生成新的分支,棄用當(dāng)前的

git describr -->用來顯示里當(dāng)前分支最近的tag錨點(diǎn),可以被commit的位置,沒有指定的話代表當(dāng)前位置輸出信息:離最近的tag_這個tag離有多少commit_g當(dāng)前id的前7位(v1_2_g3234rt5

git bisect一個找尋有bug的commit命令

git fetch從遠(yuǎn)端獲取本地倉庫未包含的提交數(shù)據(jù),即將本地對遠(yuǎn)端的映射做了同步更新

git pull == git fetch;git merge在一起的效果

git pull --rebase是fetch和rebase的合用效果

git fakeTeamwork默認(rèn)行為是在遠(yuǎn)端master做一個提交

追蹤遠(yuǎn)端的兩種方法:

1,git checkout -b分支名origin/master --》創(chuàng)建一個跟蹤origin/master的新分支(不是master了)

2,git branch -u origin/master分支名

git push :git push origin master--》切到master分支,抓取所有的提交推送到遠(yuǎn)端的master分支,基本上用于同步兩倉庫(在分支上push后沒有參數(shù)命令是沒有效果的)

git push origin::git push origin foo^:master--》foo^指foo分支的父部,表示推送foo分支父部與遠(yuǎn)端master同步,如果遠(yuǎn)端的master是branch分支,實(shí)際是不存在的,git會在遠(yuǎn)端為你創(chuàng)建。

git fetch origin foo(分支名)--》在本地foo分支進(jìn)行遠(yuǎn)端同步

git fetch origin ::git fetch origin foo~1:bar --》表示本地bar分支同步到遠(yuǎn)端foo分支的父部;和push相似,但是方向相反,push是推送,fetch是下載

另外有兩種不需要的情況,這是通過空參數(shù)實(shí)現(xiàn)的。

1,git push origin :foo -->遠(yuǎn)端會刪除foo這個分支

2,git fetch origin :foo --》本地會創(chuàng)建一個新的分支

pull和fetch的等價

^和~后不跟數(shù)字都是默認(rèn)父部,跟數(shù)字,就從當(dāng)前開始到數(shù)字的那個父部

(gitbranch bugWork HEAD~^2~創(chuàng)建分支bugWork同時移動到指定位置)

解決沖突,兩個分支同時更改了文件并都沒有更新提交后合并就會產(chǎn)生沖突,這是我們打開文件會看到git標(biāo)記的沖突的地方,進(jìn)行修改后,把沖突標(biāo)記更改為已解決,然后在add提交合并。

git log --graph --pretty=oneline --abbrev-commit-->這個命令可以看到分支合并的情況

此時可以branch -d分支了。

分支管理:通常合并分支,如果可能,git會用fast forward模式,但是這種模式下刪除分支,會丟掉分支信息。如果禁用fast forward模式,git會在merge時生成新的commit,就可以從歷史看出分支信息

一個分支對文件進(jìn)行更改并提交,但是合并時我們用了這個命令

git merge --no-ff -m "描述"要合并來的分支名--> --no-ff表示禁用fast forward

此時對分支進(jìn)行刪除后

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

-->此時是可以看到分支的信息的

bug分支每個bug都可以通過一個新的臨時分支來修復(fù),修復(fù)后合并分支,返回把臨時分支刪除。

git stash -->當(dāng)前分支的任務(wù)進(jìn)行到一半還不能提交,可以用此命令把當(dāng)前工作現(xiàn)場“儲藏”,等后續(xù)恢復(fù)現(xiàn)場后繼續(xù)工作。此時可以在其他分支上創(chuàng)建臨時分支進(jìn)行bug修復(fù)。修復(fù)完成后,提交合并,刪除臨時分支。

此時stash的那個分支,需要用到新的命令了

git stash list -->可以查看“儲藏”的分支,現(xiàn)在需要恢復(fù)一下,有兩種方法

1,git stash apply需要配合git stash drop來進(jìn)行刪除stash“儲藏”的信息內(nèi)容

2,git stash pop恢復(fù)的同時把stash內(nèi)容也刪除

如果多次stash時,恢復(fù)時先git stash list查看,用git stash apply stash@{第幾個(從0開始計數(shù))}feature分支開發(fā)一個新feature最好新建一個分支,如果要丟棄一個沒合并過的分支,使用git branch -D分支

多人協(xié)作克隆時git自動把本地master和遠(yuǎn)程master對應(yīng)起來,遠(yuǎn)程倉庫默認(rèn)名稱origin

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

git remote -v -->顯示更詳細(xì)的信息

git push origin master -->推送master分支

多人協(xié)作的通常模式:

1,首先,可以試圖git push

origin分支名推送自己的修改

2,推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新,需要先git pull更新合并本地代碼

3,如果合并有沖突,解決沖突并在本地提交

4,沒有沖突或者已經(jīng)解決掉后,用git

push origin分支名推送就可以成功了

如果git pull提示“no tracking information”,說明本地分支與遠(yuǎn)程分支沒有創(chuàng)建鏈接,用命令git branch --set-upstream分支名origin/分支名創(chuàng)建鏈接(在本地創(chuàng)建和遠(yuǎn)程分支對應(yīng)的分支,git checkout -b分支名origin/分支名,名稱最好一致),如果有沖突要先處理沖突


標(biāo)簽管理:

標(biāo)簽和HEAD很像,但是不可以移動,是版本庫的一個快照,讓人更容易記住,更容易找的那個版本,標(biāo)簽只存在本地,不會自動推送到遠(yuǎn)程。

git tag標(biāo)簽信息-->打標(biāo)簽,默認(rèn)為HEAD,也可以指定一個commit id。

git tag -->查看所有標(biāo)簽信息,標(biāo)簽信息不是按照時間順序,是按照字母順序的

git log --pretty=oneline --abbrev-commit -->找的歷史忘記需要打標(biāo)簽但是忘記打標(biāo)簽的commit id。

git tag標(biāo)簽信息commit id -->對某個commit id打標(biāo)簽

git show標(biāo)簽信息-->查看這個標(biāo)簽對應(yīng)的版本信息,包括PGP簽名信息

git tag -a標(biāo)簽信息-m“標(biāo)簽說明”commit id --> -a指定標(biāo)簽名,-m指定說明文字

git tag -s標(biāo)簽信息-m“標(biāo)簽說明”commit id -->可以通過-s用私鑰簽名一個標(biāo)簽

簽名采用PGP簽名,所以要先安裝gpg(GnuPG),如果沒有或者沒有g(shù)pg密鑰對。會報錯,此時需要GnuPG文檔配置key。

git tag -d標(biāo)簽信息-->如果標(biāo)簽打錯了,可以通過這個命令刪除

git push origin標(biāo)簽信息-->推送某個標(biāo)簽信息到遠(yuǎn)程

git push origin --tags -->一次性推送全部未推送到遠(yuǎn)程的本地標(biāo)簽

git push origin :refs/tags/標(biāo)簽信息-->刪除一個遠(yuǎn)程的標(biāo)簽,先刪除本地標(biāo)簽后,繼續(xù)這個命令,可以登錄github查看是否已經(jīng)刪除

在github上如果你要修復(fù)別人的項(xiàng)目,點(diǎn)擊Fork,這是把這個項(xiàng)目克隆到你github的賬號下,然后繼續(xù)克隆到本地倉庫電腦上,這時你就可以干活了,完畢后推送到自己的github,如果要推送到別人的項(xiàng)目,你可以pull request,至于接不接受就看別人的心情而定了。

另外,git config --global color.ui true -->使git適當(dāng)?shù)娘@示不同的顏色


忽略特殊文件:關(guān)于.gitignore文件,github已經(jīng)準(zhǔn)備了各種配置文件,https://github.com/github/gitignore所有配置文件可以直接在線瀏覽,當(dāng)然.gitignore文件是需要放到版本庫的,并且可以對.gitignore做版本管理

忽略的原則:

1,忽略操作系統(tǒng)自動生成的文件,比如縮略圖

2,忽略編譯生成的中間文件、可執(zhí)行文件等,也就是說如果一個文件是通過另一個文件自動生成的,那這個自動生成的文件就不用放進(jìn)版本庫,比如.class

3,忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件

你要添加一個文件到git,發(fā)現(xiàn)添加不了,有一下兩個解決方法

git add -f文件名-->有可能是被.gitignore忽略了,可以用-f強(qiáng)制添加

git check-ignore -v文件名-->也有可能是.gitignore寫的有問題,需要找出寫錯的這個規(guī)則,可以用這個命令檢查

配置別名:這些命令單詞這么多真心不好記又容易寫錯,所以這時我們可以為這些命令換一個簡單的別名

git config --global alias.別名(st)命令(status)-->例如給status的別名是st,--golbal是全部參數(shù),所以配置好就可以在這臺電腦的所以git倉庫下都有用,如果不加只對當(dāng)前倉庫有效

git config --global alias. unstage 'reset HEAD'-->撤銷修改的別名,git reset HEAD文件名--> git unstage文件名

git config --global alias. last 'log -1' -->顯示最后一次提交的信息的別名配置

git config--global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'--abbrev-commit" -->這個配置出來的效果絢麗,是studio內(nèi)的version control內(nèi)的log的信息。

配置文件:首先配置文件是存放在.git/config文件中的。

cat .git/config -->出來的信息中[alias]的信息里是別名配置信息,要刪除別名,直接把對應(yīng)的行刪掉即可

cat .gitconfig -->里面是[alias][user]的信息,配置別名可以直接修改這個文件,配置錯了,可以刪掉文件重新通過命令配置


搭建git服務(wù)器:

需要一臺Linux的機(jī)器(推薦使用Ubuntu/Debian,這樣可以幾條apt命令就可以安裝完成)

假設(shè)你已經(jīng)有sudo權(quán)限的用戶賬號

1,sudo apt-get install git --》安裝git

2,sudo adduser git --》創(chuàng)建git用戶,用來運(yùn)行g(shù)it服務(wù)

3,創(chuàng)建證書登錄:收集所有要登錄的用戶公鑰(id_ras.pub文件),把所有公鑰導(dǎo)入到/home/git/.ssh/authorized_keys文件里,一行一個。

4,sudo git init --baresample.git --》初始化git倉庫,假設(shè)是/srv/sample.git,在/srv目錄下輸入這行命令,git會創(chuàng)建一個裸倉庫,裸倉庫是沒有工作區(qū)的,因?yàn)榉?wù)器上的git倉庫純粹是為了共享,所以不讓用戶登錄到服務(wù)器上去改工作區(qū),并且服務(wù)器上的git倉庫通常是以.git結(jié)尾,sudo chown-R git:git sample.git --》把owner改為git

5,禁用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àn)槲覀優(yōu)間it用戶指定的git-shell每次一登錄就自動退出

6,git clone git@server:/srv/sample.git --》通過命令克隆遠(yuǎn)程倉庫,在各自電腦上運(yùn)行當(dāng)團(tuán)隊人數(shù)很多時,公鑰就不能放在服務(wù)器的authorized_keys文件里這么玩了,此時用Ditosis來管理公鑰。

像svn那樣控制權(quán)限,用Gitolite

國外友人制作的git

cheat sheet:https://pan.baidu.com/s/1kU5OCOB#list/path=%2F(Git Cheat Sheet)

git官方網(wǎng)站:http://git-scm.com

本次總結(jié)來源于廖雪峰博客,網(wǎng)址:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

另外附贈一份練習(xí)git的小游戲:http://learngitbranching.js.org/

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

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

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