一、SVN與Git的最主要的區(qū)別?
說(shuō)起git自然想到SVN,我剛接觸到的版本控制工具是SVN,SVN是集中式版本控制系統(tǒng),版本庫(kù)是集中放在中央服務(wù)器的,干活的時(shí)候,先要從中央服務(wù)器哪里得到最新的版本,干完活后,需要把自己做完的活推送到中央服務(wù)器。中央服務(wù)器就好比是一個(gè)圖庫(kù),你要改一本書,必須先從圖庫(kù)借出來(lái),然后回到家自己改,改完了,再放回圖庫(kù)。集中式版本控制系統(tǒng)是必須聯(lián)網(wǎng)才能工作,如果在局域網(wǎng)還可以,帶寬夠大,速度夠快,如果在互聯(lián)網(wǎng)下,如果網(wǎng)速慢的話,就耽誤事了。
Git是分布式版本控制系統(tǒng),它沒(méi)有中央服務(wù)器的,每個(gè)人的電腦就是一個(gè)完整的版本庫(kù),工作的時(shí)候就不需要聯(lián)網(wǎng)了,因?yàn)榘姹径际窃谧约旱碾娔X上。既然每個(gè)人的電腦都有一個(gè)完整的版本庫(kù),那多個(gè)人如何協(xié)作呢?比如說(shuō)自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時(shí),你們兩之間只需把各自的修改推送給對(duì)方,就可以互相看到對(duì)方的修改了。
和集中式版本控制系統(tǒng)相比,分布式版本控制系統(tǒng)的安全性要高很多,因?yàn)槊總€(gè)人電腦里都有完整的版本庫(kù),某一個(gè)人的電腦壞掉了不要緊,隨便從其他人那里復(fù)制一個(gè)就可以了。而集中式版本控制系統(tǒng)的中央服務(wù)器要是出了問(wèn)題,所有人都沒(méi)法干活了。
Git基本常用命令如下:
二、常用的git命令
–文件目錄操作命令
1 mkdir * 創(chuàng)建一個(gè)空目錄 指目錄名
2 pwd 顯示當(dāng)前目錄的路徑。
3 cat * 查看文件內(nèi)容
4 git rm * 刪除**文件
–git初始化操作
1 git init 把當(dāng)前的目錄變成git倉(cāng)庫(kù),生成隱藏.git文件。
2 git remote add origin url 把本地倉(cāng)庫(kù)的內(nèi)容推送到GitHub倉(cāng)庫(kù)。
3 git clone git@url/test.git 從遠(yuǎn)程庫(kù)克隆
4 git add * 把x文件添加到暫存區(qū)去。
5 git commit –m “*” 提交文件 –m 后面的是注釋。
–git 克隆分支
1 git clone xxx.git 最簡(jiǎn)單直接的命令
2 git clone xxx.git “指定目錄” clone到指定目錄
3 git clone -b branchname xxx.git clone時(shí)創(chuàng)建新的分支替代默認(rèn)Origin HEAD(master)
–clone 遠(yuǎn)程分支
git clone 命令默認(rèn)的只會(huì)建立master分支,如果你想clone指定的某一遠(yuǎn)程分支(如:dev)的話,可以如下:
1. 查看所有分支(包括隱藏的) git branch -a 顯示所有分支
1 * master
2 remotes/origin/HEAD -> origin/master
3 remotes/origin/dev
4 remotes/origin/master
2. 在本地新建同名的(“dev”)分支,并切換到該分支
1 git checkout -t origin/dev 該命令等同于:
2 git checkout -b dev origin/dev
–查看命令
1 git status 查看倉(cāng)庫(kù)狀態(tài)
2 git diff * 查看X文件修改了那些內(nèi)容
3 git log 查看歷史記錄
4 git reflog 查看歷史記錄的版本號(hào)id(記錄你的每一次命令,不論是否提交)
5 git log --pretty=oneline 如果信息量太多可以進(jìn)行比較好的列表顯示
–版本回退
1 git reset –hard HEAD^ 回退到上一個(gè)版本
2 git reset --hard HEAD~第幾個(gè) 如果想回退到第3個(gè)版本,使用git reset –hard HEAD~3
3 git reset --hard 057d 回退到某一個(gè)具體的版本號(hào)
–撤銷修改
1 git checkout file-name 恢復(fù)某個(gè)已修改的文件(撤銷未提交的修改):
2 git revert HEAD 還原最近一次提交的修改:
3 git revert commit-id 還原指定版本的修改
–分支管理
復(fù)制代碼
1 git branch 查看本地所有的分支
2 git branch -a 查看遠(yuǎn)程所有的分支
3 git branch name 創(chuàng)建分支
4 git branch –d dev 刪除dev分支
5 git push origin --delete dev 刪除遠(yuǎn)程的dev分支
6 git branch -m dev develop 重命名分支
7 git checkout –b dev 創(chuàng)建dev分支 并切換到dev分支上
8 git merge dev 在當(dāng)前分支上合并dev分支代
9 git push origin zyf-dev 把當(dāng)前新疆的zyf-dev分支推送到遠(yuǎn)程庫(kù)(遠(yuǎn)程倉(cāng)庫(kù)沒(méi)有給分支則會(huì)新建立該分支)
10 git checkout — * 把XX文件在工作區(qū)的修改全部撤銷。
11 git checkout master 切換回master分支
12 git push --set-upstream origin dev 提交修改并創(chuàng)建遠(yuǎn)程分支dev
復(fù)制代碼
–tag相關(guān)操作
1 git tag 列出所有的tag
2 git tag name 打輕量標(biāo)簽 name
3 git tag -d name 刪除本地的tag
4 git push origin --delete tag name 刪除遠(yuǎn)程的tag
5 git show name 查看tag信息
6 git push origin name 將tag提交到遠(yuǎn)程
–隱藏的文件
1 git stash 把當(dāng)前的工作隱藏起來(lái) 等以后恢復(fù)現(xiàn)場(chǎng)后繼續(xù)工作
2 git stash list 查看所有被隱藏的文件列表
3 git stash apply 恢復(fù)被隱藏的文件,但是內(nèi)容不刪除
4 git stash drop 刪除文件
5 git stash pop 恢復(fù)文件的同時(shí) 也刪除文件
–查看遠(yuǎn)程庫(kù)信息(git remote的用法)
1 git remote 查看遠(yuǎn)程庫(kù)的信息
2 git remote –v 查看遠(yuǎn)程庫(kù)的詳細(xì)信息
3 git remote add name url 添加遠(yuǎn)程倉(cāng)庫(kù)
4 git remote rename oldname newname 重命名倉(cāng)庫(kù)
5 git remote rm 刪除倉(cāng)庫(kù)
–將遠(yuǎn)程分支拉取到本地
1 方法一:git checkout -b 本地分支名x origin/遠(yuǎn)程分支名x
2 方式二:git fetch origin 遠(yuǎn)程分支名x:本地分支名x
–git pull操作
復(fù)制代碼
1 git pull命令的作用是,取回遠(yuǎn)程主機(jī)某個(gè)分支的更新,再與本地的指定分支合并,基本的格式如下。
2 $ git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>
3
4 取回origin主機(jī)的next分支,與本地的master分支合并,需要寫成下面這樣
5 $ git pull origin next:master
6
7 如果遠(yuǎn)程分支是與當(dāng)前分支合并,則冒號(hào)后面的部分可以省略。
8 $ git pull origin next
9
10 上面命令表示,取回origin/next分支,再與當(dāng)前分支合并。實(shí)質(zhì)上,這等同于先做git fetch,再做git merge。
11 $ git fetch origin
12 $ git merge origin/next
13
14 在某些場(chǎng)合,Git會(huì)自動(dòng)在本地分支與遠(yuǎn)程分支之間,建立一種追蹤關(guān)系(tracking)。比如,在git clone的時(shí)候,所有本地分支默認(rèn)與遠(yuǎn)程主機(jī)的同名分支,建立追蹤關(guān)系,也就是說(shuō),本地的master分支自動(dòng)”追蹤”origin/master分支。
15 Git也允許手動(dòng)建立追蹤關(guān)系。
16 git branch --set-upstream master origin/next
17
18 上面命令指定master分支追蹤origin/next分支。如果當(dāng)前分支與遠(yuǎn)程分支存在追蹤關(guān)系,git pull就可以省略遠(yuǎn)程分支名。
19 $ git pull origin
復(fù)制代碼
–git 設(shè)置大小寫敏感
Windows上的Git默認(rèn)是大小寫不敏感的,這樣多平臺(tái)寫作就可能會(huì)出現(xiàn)問(wèn)題。Win上的Git設(shè)置為大小寫敏感的命令如下
1 git config core.ignorecase false
–git 設(shè)置忽略文件或文件夾權(quán)限修改
1 git config core.filemode false
–創(chuàng)建追蹤分支
不帶任何參數(shù)的git push,默認(rèn)只推送當(dāng)前分支,這叫做simple方式。此外,還有一種matching方式,會(huì)推送所有有對(duì)應(yīng)的遠(yuǎn)程分支的本地分支。Git 2.0版本之前,默認(rèn)采用matching方法,現(xiàn)在改為默認(rèn)采用simple方式。如果要修改這個(gè)設(shè)置,可以采用git config命令。
$ git config --global push.default matching
$ git config --global push.default simple (最好使用這種方式)
$ git branch --track master origin/master //在使用 git branch 命令時(shí)加上 ‘–track’ 參數(shù), 來(lái)手動(dòng)創(chuàng)建一個(gè)追蹤分支
–切換git 命令提示中文到英文
// ubuntu裝的git不知道怎么就出現(xiàn)全中文的提示,不太好,果斷切換到中文了,切換方法如下:
// 1:寫入
echo “alias git=‘LANG=en_GB git’” >> ~/.bashrc
// 2:生效
source ~/.bashrc
–git 刪除未添加到版本中的文件或者文件夾
git checkout 只能回退在版本中的修改或者刪除, 對(duì)于新添加的文件是沒(méi)有作用的, 也就是說(shuō), 新建的文件或者文件夾是:Untracked files, 要?jiǎng)h除或者清理掉這些文件,需要使用 git clean 命令:
復(fù)制代碼
1 // 刪除 untracked files
2 git clean -f
3
4 // 連 untracked 的目錄也一起刪掉
5 git clean -fd
6
7 // 連 gitignore的untrack 文件/目錄也一起刪掉 (一般這個(gè)是用來(lái)刪掉編譯出來(lái)的 .o一類的文件)
8 git clean -xfd
9
10 // 在使用清理 git clean之前,建議加上 -n 來(lái)先看看會(huì)刪掉哪些文件,防止重要文件被誤刪
11 git clean -nxfd
12 git clean -nf
13 git clean -nfd
復(fù)制代碼
三、常出錯(cuò)誤:
1:There is no tracking information for the current branch…
則說(shuō)明本地分?支和遠(yuǎn)程分?支的鏈接關(guān)系沒(méi)有創(chuàng)建,用命令:
git branch --set-upstream branch-name origin/branch-name。
2: ![rejected] dev -> dev (non-fast-forward) … Updates were rejected because the tip of your current branch
推送失敗,因?yàn)檫h(yuǎn)程代碼的最新提交和你試圖推送的提交有沖突,解決辦法也很簡(jiǎn)單,先用git pull把最新的提交從origin/dev抓下來(lái),然后,在本地合并,解決沖突,再推送
3:CONFLICT (content): Merge conflict in . . .
這回git pull成功,但是合并有沖突,需要手動(dòng)解決,解決的方法和分支管理中的解決沖突一樣。解決后,提交,再push:
4: You are not currently on a branch, so I cannot use any
解決辦法:git checkout master
5:Your branch is behind ‘origin/master’ by 1 commit, and can be fast-forwarded.
上面的顯示的意思是,有一個(gè)更新還沒(méi)有反應(yīng)到本地來(lái),可能是別人往server上提交了一點(diǎn)東西。
可以使用git pull命令拿這些更新到本地來(lái)。
6:在執(zhí)行 git push 時(shí)可能會(huì)看到如下消息:
warning: push.default is unset; its implicit value is changing in
Git 2.0 from ‘matching’ to ‘simple’. To squelch this message
and maintain the current behavior after the default changes, use:
git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simpl
解決辦法:‘matching’ 參數(shù)是 Git 1.x 的默認(rèn)行為,如果你執(zhí)行 git push 但沒(méi)有指定分支,它將 push 所有你本地的分支到遠(yuǎn)程倉(cāng)庫(kù)中對(duì)應(yīng)匹配的分支。而 Git 2.x 默認(rèn)的是 simple,意味著執(zhí)行 git push 沒(méi)有指定分支時(shí),只有當(dāng)前分支會(huì)被 push 到你使用 git pull 獲取的代碼。
根據(jù)提示,修改git push:
1 git config --global push.default matching
再次執(zhí)行g(shù)it push 就行了。
7:You asked to pull from the remote ‘origin’, but did not specify: a branch. Because this is not the default configured remote for your current branch, you must specify a branch on the command line.
解決辦法:找到:.git/config 修改如下
1 [branch “master”]
2 remote = origin
3 merge = refs/heads/master
8:ERROR: Permission to user1/test.git denied to user2 fatal: The remote end hung up unexpectedly
賬戶沖突,下面有針對(duì)講解
9: 添加的ssh不起作用?
ssh 的添加一定要在root用戶權(quán)限在添加,其他的權(quán)限不起作用,切記!
四、經(jīng)驗(yàn)之談:
1:git revert 和 git reset的區(qū)別
開始感覺(jué)兩者一樣,但是在客戶端和命令行窗口操作之后發(fā)現(xiàn)大大的不同,看一個(gè)例子:我先提交三次1,2,3 id號(hào)分別是(15d5f70,a167eb1,8fbfe3f)如下圖
然后執(zhí)行版本回退 git reset –hard a167 如圖:
說(shuō)明執(zhí)行g(shù)it reset –hard ** 版本回退是撤銷某次提交,但是此次之后的修改都會(huì)被退回到暫存區(qū),因?yàn)樯厦骘@示有提交(by 1 commit)
同理執(zhí)行 git revert –hard a167
git revert是用一次新的commit來(lái)回滾之前的commit
在回滾操作上看,效果一樣。但是在日后繼續(xù)merge以前的老版本時(shí)有區(qū)別。revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch時(shí),導(dǎo)致這部分改變不會(huì)再次出現(xiàn),但是reset是之間把某些commit在某個(gè)branch上刪除,因而和老的branch再次merge時(shí),這些被回滾的commit應(yīng)該還會(huì)被引入。
得到結(jié)論:git reset 是把HEAD向后移動(dòng)了一下,而git revert是HEAD繼續(xù)前進(jìn),
只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反,能夠抵消要被revert的內(nèi)容。
這樣在版本回退的時(shí)候就比較的好,比如本地dev分支,遠(yuǎn)程master分支,某一次的上線發(fā)現(xiàn)線上有重大的bug,然后你reset本地代碼到前一個(gè)版本,在你git push 的時(shí)候git會(huì)報(bào)一個(gè)錯(cuò)誤:“說(shuō)你的本地分支版本低于遠(yuǎn)程master分支的版本,讓你先去pull 下來(lái)代碼,再提交”,這就不行了,你pull下來(lái)的代碼還是最新版有bug的代碼,不進(jìn)行pull代碼,master分支又不讓你提交。解決這個(gè)問(wèn)題還得使用 revert 來(lái)進(jìn)行 “回退”操作,為什么加引號(hào)呢,是因?yàn)檫@種回退是向前提交一次中和了上次的修改,這就比較好了,這樣你revert之后相當(dāng)于指針向前移動(dòng)一次,本地版本dev高于遠(yuǎn)程master版本,這時(shí)你就可以git push 本地代碼到遠(yuǎn)程了。也就是說(shuō),git reset 對(duì)未提交到(git push)遠(yuǎn)程的修改做回滾比較好,如果要回滾本地,同時(shí)想遠(yuǎn)程也回滾,就要用到revert
五、常用修改:
1:避免每次提交都輸入用戶名和密碼
原因是使用了https方式 puh 在termail里邊 輸入 git remote -v 可以看到形如一下的返回結(jié)果
origin https://github.com/git/librarysystem.git(fetch)
origin https://github.com/git/librarysystem.git(push)
下面把它換成ssh方式的。
3:如何在同一臺(tái)電腦上使用兩個(gè)git賬戶
問(wèn)題描述:作為程序員有時(shí)候是有多個(gè)的項(xiàng)目,而且每個(gè)項(xiàng)目git的用戶名,郵箱等,都不一樣。就我來(lái)說(shuō),我在github上有一個(gè)賬號(hào),自己開發(fā)一些東西,同時(shí)我參與的也有項(xiàng)目需要連接別人的github賬號(hào),在我電腦上只有一個(gè)git客戶端,本地一個(gè)身份用戶,開始的時(shí)候我自己開發(fā)是用ssh方式,參與的項(xiàng)目的是用https連接,但是https每次都需要輸入密碼,非常不方便,所以想轉(zhuǎn)成ssh連接,利用命令:
$ git remote rm origin
$ git remote add origin git@github.com:yu/demo.git
$ git push origin
轉(zhuǎn)換成功,不幸的是push的時(shí)候出錯(cuò)了:ERROR: Permission to user1 denied to
這種情況的解決方式是方法,使用本地托管多個(gè)個(gè)ssh的密鑰,不同的賬號(hào)是用不同的密匙。
第一步:生成SSH Key
執(zhí)行命令,如下圖:
具體說(shuō)明:
1 ssh-add ~/.ssh/id_rsa_work
2 //該命令如果報(bào)錯(cuò):Could not open a connection to your authentication agent.可執(zhí)行 ssh-agent bash 命令后再執(zhí)行ssh-add -l 看是否成功。
執(zhí)行命令,如下圖:
第三步:修改config文件
該文件用于配置私鑰對(duì)應(yīng)的服務(wù)器。內(nèi)容如下:
復(fù)制代碼
1 # Default github (默認(rèn)的)
2 Host github.com
3 HostName github.com
4 User git
5 IdentityFile ~/.ssh/id_rsa
6
7 # second user(work@gmail.com)
8 Host github_work
9 HostName github.com
10 User git
11 IdentityFile ~/.ssh/id_rsa_work
復(fù)制代碼
這樣配置,也就是使用hostname為github.com會(huì)根據(jù)用戶名的不同,去使用不用的private key。github上,也可以添加對(duì)應(yīng)的公鑰。其實(shí)這個(gè)配置是關(guān)于ssh的與git無(wú)關(guān),只是git使用的方式是ssh的方式。Host可隨意,方便自己記憶,后續(xù)在添加remote是還需要用到。
第四步:將SSH key輸入到GitHub網(wǎng)站中
將生成的id_rsa_work.pub輸入到GitHub網(wǎng)站中就可以了,輸入完成后單擊Add key后,會(huì)看到git-tutorial已經(jīng)被添加進(jìn)去了。 配置完成后,在連接非默認(rèn)賬號(hào)的github倉(cāng)庫(kù)時(shí),遠(yuǎn)程庫(kù)的地址要對(duì)應(yīng)地做一些修改,比如現(xiàn)在添加abc賬號(hào)下的一個(gè)倉(cāng)庫(kù)test,則需要這樣添加:git remote add test git@github-work:abc/test.git #并非原來(lái)的git@github.com:abc/test.git 這樣每次連接都會(huì)使用id_rsa_abc與服務(wù)器進(jìn)行連接。
注意:github根據(jù)配置文件的user.email來(lái)獲取github賬號(hào)顯示author信息,所以對(duì)于多賬號(hào)用戶一定要記得將user.email改為相應(yīng)的email(work@mail.com)。我遇到的問(wèn)題是本地單一用戶,鏈接不同的github賬號(hào),所以用戶配置可以采用全局配置。如果不同本地用戶(不同的身份標(biāo)識(shí),即需要本地使用不同的用戶名),那么git就不要使用有–global的配置,可以按照下面的方法:
1 1)設(shè)置局部的user.name和user.email
2 git config user.name “xxxxxx”
3 git config user.email
4 2)設(shè)置全局的user.name和user.email
5 git config --global user.name “xxxxxx”
6 git config –-global user.email “”
六、題外話(相關(guān)概念)
Git - 版本控制工具
Git是一個(gè)開源的分布式版本控制系統(tǒng),用以有效、高速的處理從很小到非常大的項(xiàng)目版本管理。Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開發(fā)而開發(fā)的一個(gè)開放源碼的版本控制軟件。Torvalds 開始著手開發(fā) Git 是為了作為一種過(guò)渡方案來(lái)替代 BitKeeper,后者之前一直是 Linux 內(nèi)核開發(fā)人員在全球使用的主要源代碼工具。開放源碼社區(qū)中的有些人覺(jué)得 BitKeeper 的許可證并不適合開放源碼社區(qū)的工作,因此 Torvalds 決定著手研究許可證更為靈活的版本控制系統(tǒng)。盡管最初 Git 的開發(fā)是為了輔助 Linux 內(nèi)核開發(fā)的過(guò)程,但是我們已經(jīng)發(fā)現(xiàn)在很多其他自由軟件項(xiàng)目中也使用了 Git。例如 最近就遷移到 Git 上來(lái)了,很多 Freedesktop 的項(xiàng)目也遷移到了 Git 上。
Github - 一個(gè)網(wǎng)站,提供給用戶空間創(chuàng)建git倉(cāng)儲(chǔ),保存用戶的一些數(shù)據(jù)文檔或者代碼等
作為開源代碼庫(kù)以及版本控制系統(tǒng),Github目前擁有140多萬(wàn)開發(fā)者用戶。隨著越來(lái)越多的應(yīng)用程序轉(zhuǎn)移到了云上,Github已經(jīng)成為了管理軟件開發(fā)以及發(fā)現(xiàn)已有代碼的首選方法。如前所述,作為一個(gè)分布式的版本控制系統(tǒng),在Git中并不存在主庫(kù)這樣的概念,每一份復(fù)制出的庫(kù)都可以獨(dú)立使用,任何兩個(gè)庫(kù)之間的不一致之處都可以進(jìn)行合并。GitHub可以托管各種git庫(kù),并提供一個(gè)web界面,但與其它像 SourceForge或Google Code這樣的服務(wù)不同,GitHub的獨(dú)特賣點(diǎn)在于從另外一個(gè)項(xiàng)目進(jìn)行分支的簡(jiǎn)易性。為一個(gè)項(xiàng)目貢獻(xiàn)代碼非常簡(jiǎn)單:首先點(diǎn)擊項(xiàng)目站點(diǎn)的“fork”的按 鈕,然后將代碼檢出并將修改加入到剛才分出的代碼庫(kù)中,最后通過(guò)內(nèi)建的“pull request”機(jī)制向項(xiàng)目負(fù)責(zé)人申請(qǐng)代碼合并。已經(jīng)有人將GitHub稱為代碼玩家的MySpace。
GitLab - 基于Git的項(xiàng)目管理軟件
GitLab 是一個(gè)用于倉(cāng)庫(kù)管理系統(tǒng)的開源項(xiàng)目。使用Git作為代碼管理工具,并在此基礎(chǔ)上搭建起來(lái)的web服務(wù)。三者都是基于git的,可以說(shuō)是git的衍生品。
聯(lián)系客服