git筆記

Git和SVN的對比:git

1)Git是分佈式的,SVN是集中式;程序員

2)Git每一個歷史版本存儲完整的文件,SVN存儲文件的差別;github

3)Git可離線完成大部分操做,SVN則必須與中央服務器進行網絡交互;服務器

4)Git有着優雅的分支和合並功能;網絡

5)Git有着更強的撤銷修改和修改版本歷史的能力;ssh

6)Git速度更快,效率更好;分佈式

 

Git安裝:工具

    CentOS6.5環境:yum install git學習

    下載源碼進行編譯再安裝:本身查閱網絡資料網站

 

which -a git 查看git的安裝位置

git version 查看git的版本

 

 

建議你們先在GitHub上面註冊一個帳號

 

如何學習Git的命令:git help

 

添加user.name和user.email

git config --global user.name fyuan925

git config --global user.email fyuan925@gmail.com

 

獲得user.name/user.email

git config user.name

git config user.email

 

添加一個新的user.name

git config --global --add user.name kgc

 

獲得屬性的值

git config user.name

git config --get user.name

 

獲得全局全部屬性的值

git config --list --global

 

刪除一個屬性,而且是指定屬性名進行刪除

git config --global --unset user.name kgc

 

git config --list --global

 

當只有一個屬性值的時候,咱們能夠在刪除時不指定值

git config --global --unset user.name

 

git config --list --global

 

git config --global user.name fyuan925

git config --list --global

 

 

Git命令的基本使用(版本控制工具只能跟蹤文本文件的改變):

git init  建立倉庫

添加一個readme.txt

git status  查看當前版本庫的狀態(查看暫存區的工做狀態)

git add filename    使用git add命令告訴git,把該文件添加到倉庫

git commit -m 'comment'  使用git commit命令告訴git,把文件提交到倉庫

 

將文件提交到倉庫,須要兩步:

    1) add

    2) commit

 

git add 能夠反覆添加多個

git diff 查看修改的內容

git log  能夠查看全部的提交歷史記錄

git log filename 僅查看指定文件名的提交歷史記錄

git log --pretty=oneline filename

d085ee8434392d2cf88b48592f29fbeefb0818f7  commit id(版本號) SHA-1 Hash計算出來一個16進制的值

 

版本回退:

    前提:知道當前版本是哪一個, HEAD表示當前版本(HEAD是指最後一次提交的commitid)

    回退到上一個版本: HEAD^   一個^就表是前一個版本, 若是N個前版本能夠用HEAD~N

 

    回退:git reset --hard HEAD^

    回退以後你後悔了又想回到後退以前的那個版本: git reset --hard xxxxxxxxx

    xxxxxxxxx  前面能夠經過 git log filename

 

    3commit   <== HEAD

    2commit

    1commit

 

    執行了git reset --hard HEAD^以後

    3commit  

    2commit  <== HEAD

    1commit

 

    git reset:版本穿梭, 可使用git log查看提交歷史,以便肯定回退/穿梭到哪一個版本

 

HEAD這個指針執行當前版本(也是git版本回退快速的緣由)

 

git reflog:查看命令歷史,以便肯定要回到將來/過去的哪一個版本(若是不知到到回退commitid可經過此命令查詢)

 

 

什麼是修改:新增一行、修改幾個字符、刪除一行、新增文件、刪除文件

Git管理的是修改,而不是文件

 

git status :是工做區和暫存區的對比,若是檢測出改變,會建議咱們add提交到暫存區或者撤銷修改。

git commit:只是將暫存區提交到歷史區,與工做區無關。

 

撤銷修改:

    沒有提交到暫存區時,其實就在工做區: git checkout -- file

    已經提交到暫存區了: 分兩步:

1)git reset HEAD file  清空暫存區中的修改

2)git checkout -- file 清空工做區的修改

 

刪除文件

    手誤刪除,如何恢復: git checkout -- file

    真刪除版本庫的文件:

        1) git rm file

        2) git commit -m 'xxx'

 

Git遠程操做之添加遠程庫

生成ssh:ssh-keygen -t rsa -C 'kgc@gmail.com'

在GitHub上設置ssh的公鑰

 

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuDoeVYFqwhspG7SrOMugb32+q8jwu0fRptuQuEREjeqsCVkGPVBuFJo3hEPwXhk87VAgEHGd6JQUEtL6CFkrld3GWcMuz+dlNTIQ1/tNnwDABvYo5/dXlR6WZ6sdn/3eT/KO1KnyQI0VDFg/smAtAVVr5guXAzg36hOAgzihh3ZVM0Gcg4cOzd0/rO5+hO7nK1q0W1Wk2aem5xX+FOWF+r+g+nQpIERL4I45JgL9rXYCPEfFnP+17FjLBAUSNNaoj4I49Z4EboyN/as58PXVPbEv7Xdhh7ARn7qFRdPKxkIhVTI/4ljIp4OAyfENYtD6qanhBu3P3WX/hYCiHN0Lww== 947186883@qq.com

 

與遠程庫創建鏈接

git remote add origin git@github.com:iamxuas/git_demo.git

git push -u origin master

    git push 就是把當前分支(master)推送到遠程

    -u:第一次推送到master分支時,要設置了,後續就不須要再使用-u了

 

git push  origin master

 

執行get push時出現錯誤及解決辦法:

當執行命令git push -u origin master時報以下錯誤

 

解決辦法:git remote set-url origin https://fdd8@github.com/fdd8/kgc_git.git,即在網址中添加GitHub的用戶名便可。

再執行命令git push -u origin master時,就不會報錯

 

 

遠程庫的兩種方式

1)先有本地倉庫,後有遠程倉庫

    git remote add origin git@github.com:fangyuan925/kgc_git.git

    git push -u origin master

    第一次使用-u,後面再也不使用

 

2)先有遠程倉庫,再clone到本地(最多見的,通常都是先在GitHub上建立倉庫,而後開發人員再clone到本地)

    git clone xxxxxx

    git push -u origin master

    第一次使用-u,後面再也不使用

 

 

 

 

Git會串成一條時間線,這條時間線就是分支, 默認就是master

HEAD並非指向提交,而是指向master

 

v1  ==>  v2  ==> v3

                 |

                 master

                  |

                  HEAD

 

 

v1  ==>  v2  ==> v3  ==> v4

                         |

                        master

                          |

                        HEAD

 

 

 

                              master

                                |

v1  ==>  v2  ==> v3  ==> v4 ==> v5  ==> v6

                                       |

                                       dev

                                       |

                                       HEAD(建立分支以後,HEAD就不指向master了,而是指向分支)

 

 

                                      Master(將dev分支合併到master上)

                                       |

v1  ==>  v2  ==> v3  ==> v4 ==> v5  ==> v6

                                       |

                                       dev

                                       |

                                       HEAD

 

查看分支:

git branch

* master

*表示你當前所處的branch是哪一個

 

 

 

git checkout -b dev (建立分支)

-b表示建立而且切換分支(HEAD指向dev分支)

 

切換分支: git checkout xxxx

 

 

git merge dev  把dev分支合併到當前分支,由於咱們當前分支是master,因此就是將dev合併到master(使用的是Fast-forward模式:直接將master指向v6,存在衝突是Fast-forward模式就不行了)

                              master =>master

                                        |

v1  ==>  v2  ==> v3  ==> v4 ==> v5  ==> v6

                                       |

                                       dev

                                       |

                                       HEAD(建立分支以後,HEAD就不指向master了,而是指向分支)

 

 

刪除分支: git branch -d dev

 

 

 

解決衝突:

feature1 :  a.txt  AND simple

master   :  a.txt  &   simple

 

                                      master

                                       |

v1  ==>  v2  ==> v3  ==> v4 ==> v5  ==> v6

                                       |

                                       feature1 

                                       |

                                      HEAD

在master和分支上分別對a.txt作了不一樣修改以後,合併分支出現如下錯誤:

git merge feature1

Auto-merging a.txt

CONFLICT (content): Merge conflict in a.txt

Automatic merge failed; fix conflicts and then commit the result.

 

cat a.txt

a.txt

 

 

在master和分支上分別對a.txt作了不一樣修改以後,a.txt的內容以下:

<<<<<<< HEAD

Creating a new branch is quick & simple.

=======

Creating a new branch is quick AND simple.

>>>>>>> feature1

 

 

<<<<<<<   =======  >>>>>>>標記出不一樣分支的內容

 

 

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

 

當Git沒法自動合併分支時,就必須首先解決衝突,再提交,最後再merge

可使用git log --graph命令能夠看到分支合併圖。

 

分支管理策略:

1)master分支: 代碼是穩定的,平時不能在上面幹活的,僅僅是用來發布新版本用

2)dev分支:是不穩定的,bug、feature能夠建立新的分支進行開發,最後再合併到master便可

    bug-id 10000    bug-10000

 

 

 

標籤操做總結:

git tag <name> 新建一個標籤,默認是HEAD,也能夠指定一個commit id

git tag -a <name> -m 'xxxxxx'指定標籤信息

git tag 查看全部標籤

 

git tag -d v0.1  刪除標籤

 

提交標籤到GitHub:git push origin v1.0

將本地全部標籤提交到遠程github:git push origin --tags

 

若是tag已經推送到遠程,要刪除遠程標籤就須要麻煩一點,分2步:

1)刪除本地tag:  git tag -d v0.9

2)git push origin :refs/tags/v0.9

 

 

Git控制檯顏色設置

git config --global color.diff auto

git config --global color.status auto

git config --global color.branch auto

 

顏色設置關閉

git config --global color.status false

 

 

忽略某些特殊文件不提交

1)只須要在git項目的根目錄下建立一個.gitignore

2) 把須要提交的文件或者目錄寫到.gitignore

3)若是你真正想提交的文件已經被包含在.gitignore裏面了,那麼就須要使用-f進行強制提交

 

 

Git配置別名:

git config --global alias.st status

git config --global alias.ci commit

git config --global alias.br branch

git config --global alias.co checkout

 

配置別名完成以後在什麼地方能看到呢?

默認在當前用戶的根目錄下有一個.gitconfig

cat .gitconfig

[user]

    email = fyuan925@gmail.com

    name = fyuan925

[color]

    diff = auto

    status = false

    branch = auto

[alias]

    st = status

    ci = commit

    br = branch

    co = checkout

 

 

知識點總結:

分支管理

場景描述:開發一個新功能,預計一週完成,你三天開發好了70%的代碼,可是還沒連調,若是此時馬上提交,因爲代碼還沒寫完,不完整的代碼庫會致使別人不能幹活。若是等代碼所有寫完再一次提交,又存在丟失天天進度的巨大風險。

分支的誕生:本身在本身的分支上開發,和別人互不影響,開發完成後再合併到master上去便可。

 

查看分支:git branch

建立分支:git branch <name>

切換分支:git checkout <name>

建立&切換分支:git checkout -b <name>

合併某分支到當前分支:git merge <name>

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

 

解決衝突時查看分支合併圖:git log --graph

Bug分支

Feature分支

 

標籤管理

什麼是標籤(tag):是版本庫的一個快照

發佈一個新版本時,一般先在版本庫中打一個標籤,不管在未來的時候,取出某個標籤的版本便可

 

建立標籤:git tag <tagname>

查看全部標籤:git tag

建立帶有說明的標籤:git tag -a <tagname> -m <desc>

查看標籤的說明:git show <tagname>

刪除標籤:git tag -d <tagname>

 

推送一個本地標籤:git push origin <tagname>

推送所有未推送的本地標籤:git push origin --tags

刪除一個本地標籤:git tag -d <tagname>

刪除一個遠程標籤:git push origin:refs/tags/<tagname>

 

 

多人協做

開源項目確定都是不少人蔘與到社區中,經過協做完成

多人協做經常使用操做

克隆遠程倉庫:git clone

查看遠程信息:git remove (-v)

解決衝突問題

推送分支:git push origin <branch-name>

建立Pull Request

(https://www.zhihu.com/question/21682976)

 

GitHub經常使用操做介紹

能夠將我的的開源項目放在GitHub中,既可讓別人參與你的項目,你也能夠參與到別人的開源項目中去

但願你們能真正參與帶本身感興趣的開源項目中去,作到從開源中來,而後回饋到開源中去

GitHub經常使用操做:clone、fork、watch、star

 

GitHub經常使用操做之博客

相信不少人都有寫博客的習慣,免費和收費的都有

近些年,一些程序員開始在github網站上搭建blog。他們既擁有絕對管理權,又享受github帶來的便利----無論什麼時候何地,只要向主機提交commit,就能發佈新文章

更妙的是,這一切仍是免費的,github提供無限流量,世界各地都能訪問

使用GitHub搭建博客

 

GitHub經常使用操做之組織

除了我的帳戶外,GitHub還提供被稱爲組織(Organizations)的帳戶

組織帳戶和我的帳戶同樣都有一個用於存放所擁有項目的命名空間,可是許多其餘的東西都是不一樣的

組織帳戶表明了一組共同擁有多個項目的人,同時也提供一些人具用於對成員進行分組管理

一般,這種帳戶被用於開源羣組(例如:「perl」或者「rails」),或者公司(例如:「google」或者「twitter」)

經過GitHub建立組織

 

 

Git其餘功能介紹

Git顏色設置

    設置顏色:git config --global color.diff auto

              git config --global color.status auto

              git config --global color.branch auto

    顏色設置關閉:git config --global color.status false

忽略特殊文件

    1)只須要在git項目的根目錄下建立一個.gitignore

    2) 把須要提交的文件或者目錄寫到.gitignore

    3)若是你真正想提交的文件已經被包含在.gitignore裏面了,那麼就須要使用-f進行強制提交

設置經常使用命名別名

    git config --global alias.st status

相關文章
相關標籤/搜索