最近公司的代碼管理工具要從SVN轉到Git上,所以雖然以前用過Git,可是都是一些簡單的推送提交,所以仍是有必要進行一些系統的學習,這裏作一下筆記,以備後詢,且不按期更新。css
關於SVN和Git的比較已經有不少文章說過了,就再也不贅述,本文的重點是如何使用經常使用的Git命令進行操做,冷門的就不說了,且比較零散,系統的學習推介廖雪峯的Git教程。html
聲明前端
SHERlocked93
,請自行修改爲本身的用戶名
操做一覽git
操做 | bash |
---|---|
建立stash | git stash |
查看 | git stash list |
應用 | git stash apply stash@{<num> } |
刪除 | git stash drop stash@{<num> } |
還原上一個暫存並刪除暫存(如無conflict) | git stash pop |
若是在工做的時候出現了臨時須要解決的問題,而你又不但願提交,那麼有個stash
功能github
git stash
在暫存後工做區會回退到最近的一個commit的狀態,以便開建新分支;好比咱們修復bug時,咱們會經過建立新的bug分支進行修復,而後合併,最後刪除;安全
當手頭工做沒有完成時,先把工做現場git stash
一下,而後去修復bug,修復後,再git stash pop
,回到工做現場。bash
當修改尚未被add
的時候,可使用微信
git checkout -- filename.txt
來丟棄工做區某文件的修改,固然也能夠把後面的文件改爲*
來撤銷全部文件的修改。這是用倉庫的文件覆蓋工做區的文件。app
注意這裏用的是--
,若是沒有這個--
的話就變成切換分支了。工具
若是你的修改已經被add
到了暫存區,可是尚未被commit
,那麼可使用
git reset HEAD filename.txt git checkout -- filename.txt
首先用reset
來把修改撤回到工做區,再使用上面的checkout
命令撤回工做區的修改。這裏的reset
至關於add
的反操做。
則能夠版本回退
git reset --hard 15zdx2s
這裏的--hard
表示強制回退,丟棄本地的修改。這個回退比較野蠻,該版本號以後的提交都將不可見。
git revert
撤銷一個提交的同時會建立一個新的提交,這是一個安全的方法,由於它不會重寫提交歷史。但實現上和reset是徹底不一樣的。它撤銷這個提交引入的更改,而後在最後加上一個撤銷了更改的新提交,而不是從項目歷史中移除這個提交。
git revert 46af7z6
相較於reset
,revert
不會改變項目歷史,對那些已經發布到共享倉庫的提交來講這是一個安全的操做。其次git revert
能夠將提交歷史中的任何一個提交撤銷、而reset
會把歷史上某個提交及以後全部的提交都移除掉,這太野蠻了。
相比 reset
,它不會改變如今的提交歷史。所以,revert
能夠用在公共分支上,reset
應該用在私有分支上。
若是已經commit
了怎麼辦,若是要撤回目前的commit
,能夠把它合併到上一個commit
中
git rebase -i HEAD~~
在出現的兩個提交信息的pick
改成fixup
操做一覽
操做 | bash |
---|---|
查看分支 | git branch |
查看本地和遠程分支 | git branch -a |
在target分支上建立分支,沒有則從當前分支 | git branch <branch-name> <target-branch> |
建立並切換分支 | git checkout -b <branch-name> |
合併某分支到當前分支 | git merge <branch-name> |
刪除分支,只能刪參與了合併的 | git branch -d <branch-name> |
強行刪除 | git branch -D <branch-name> |
刪除遠程分支 | git push origin :<remote-branch-name> |
建立分支
# 建立新分支 git branch bug-fix # 查看分支,-a查看本地和遠程的分支,-r查看遠程分支,-l或沒有隻查看本地 git branch -a # 切換到剛剛建立的分支 git checkout bug-fix
上面兩個步驟能夠合併爲
# 建立並切換到分支 git checkout -b bug-fix
若是修改一下本地文件以後在這個分支繼續培育一個版本以後,怎麼去合併到主分支呢
git add * git commit -m "some change" # 切換到主分支 git checkout master # 合併分支 git merge bug-fix # 刪除分支 (可選) git branch -d bug-fix
若是master分支和新的分支都各自培育了版本,那麼自動合併一般會失敗,發生衝突conflict
,此時須要打開文件解決衝突以後commit
一個版本以完成合並
git add * git commit -m "branch merge"
這裏提一下,merge
的時候有幾個主要模式,--no-ff
、fast-forward
,其中fast-forward
是默認的
fast-forward
:在master開始的新分支前進了幾個版本以後若是須要merge回來,此時master並無前進,那麼這個模式就是把HEAD與master指針指向新分支上,完成合並。這種狀況若是刪除分支,則會丟失分支信息,由於在這個過程當中並無建立commit。--no-ff
:關閉默認的fast-forward
模式,也就是在merge的時候生成一個新的commit,這樣在分支歷史上就能夠看出分支信息。操做一覽
操做 | bash |
---|---|
克隆 | git clone <url> |
添加遠程倉庫 | git remote add <name> <url> |
刪除遠程倉庫 | git remote rm <name> |
拉取 | git pull <remote-branch-name> <local-branch-name> |
推送本地全部分支到遠程 | git push --all origin |
推送到遠程同名分支 | git push origin <local-branch-name> |
推送本地分支到遠程master | git push origin <local-branch-name> :master |
把當前本地分支推送並建立到遠程 | git push origin |
檢出遠程分支 | git checkout -b <new-local-branch-name> origin/<remote-branch-name> |
關於各個分支,哪些須要推送呢
master
分支是主分支,所以要時刻與遠程同步;dev
分支是開發分支,團隊全部成員都須要在上面工做,因此也須要與遠程同步;bug
分支只用於在本地修復bug,就不必推到遠程了,除非老闆要看看你每週到底修復了幾個bug;feature
分支是否推到遠程,取決於你是否和你的小夥伴合做在上面開發。clone
在github上建立一個新的項目以後,好比叫learn-git
,那麼能夠直接clone
下來,注意建立的時候不要選擇 Initialize this repository with a README
,咱們要的是一個空的倉庫
git clone https://github.com/SHERlocked93/learn-git.git
這樣在本地就直接建立了一個空的文件夾learn-git
,固然裏面有.git
文件夾。
也可使用SSH地址來clone,速度會快一些,也不用每次推送都輸入口令,推介使用這種
git clone git@github.com:SHERlocked93/learn-git.git
添加一個文件filename.txt
以後
git add filename.txt git commit -m "add filename.txt" git push -u origin master
這樣就把本地新建的文件push到了遠程倉庫
若是已經有了本地工程文件夾,如何分享到github遠程倉庫呢,固然此時咱們已經在github上建立了一個新的空白項目,仍是叫learn-git
,在本地文件夾中
git init # 關聯遠程庫 git remote add origin git@github.com:SHERlocked93/learn-git.git git push -u origin master
就能夠了,若是你的遠程倉庫已經有了提交,那麼在push
以前須要
# 容許不想幹庫合併 git pull origin master --allow-unrelated-histories git push -u origin master
先拉取遠程分支,注意這裏--allow-unrelated-histories
容許兩個不想幹的分支強行合併,再push
;這樣在github的網站上還能看到commit記錄。
也能夠強硬一點直接強行推送
# -f 強行推送 git push -u origin master -f
這樣本地倉庫就直接把遠程倉庫覆蓋了,且github上也看不到歷史commit
了,若是不想被同事槍擊的話,仍是推介上一種作法。
那麼已經clone的倉庫若是但願同步原倉庫新的提交怎麼辦
# 從遠程分支拉取代碼到本地 git pull upstream master # push到本身的庫裏 git push origin master
多人協做的工做模式一般是這樣:
git push origin <branch-name>
推送本身的修改;git push origin <branch-name>
推送就能成功從遠程抓取分支,使用git pull
,若是有衝突,要先處理衝突,add->commit->push
。若是git pull
提示no tracking information,則說明本地分支和遠程分支的連接關係沒有建立,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
操做一覽
操做 | bash |
---|---|
查看全部標籤 | git tag |
新建標籤 | git tag <tagname> |
新建並制定說明 | git tag <tagname> -m <message> <bash> |
查看標籤說明 | git show <tagname> |
刪除標籤 | git tag -d <tagname> |
推送某個標籤到遠程 | git push origin <tagname> |
推送全部未推送到遠程的本地標籤 | git push origin --tags |
合併遠程倉庫的標籤到本地 | git pull origin --tags |
刪除遠程標籤 | git push origin :refs/tags/<tagname> |
若是要刪除遠程分支,須要
# 首先刪除本地tag,假如tag是v0.9 git tag -d v0.9 # 再從遠程刪除 git push origin :refs/tags/v0.9
type:
網上的帖子大多深淺不一,甚至有些先後矛盾,在下的文章都是學習過程當中的總結,若是發現錯誤,歡迎留言指出~
推介閱讀:
附件
PS:歡迎你們關注個人公衆號【前端下午茶】,一塊兒加油吧~
另外能夠加入「前端下午茶交流羣」微信羣,長按識別下面二維碼便可加我好友,備註加羣,我拉你入羣~