1. 程式人生 > >Git教程_持續更新

Git教程_持續更新

git reset 建立 this 1.0 gre 工作 快捷 決定 eset

Git教程

更新12/14/2017 5:21:57 PM

更新11/22/2017 6:27:24 PM

寫在前面,在heroku上部署了python web應用,迎合大眾,所有操作都是在Ubuntu上操作。由於git版本管理沒有掌握好,在Ubuntu和Windows上面的命令有一定的不同,造成了迥異的報錯。現整理歸類一下:

方法一

  1. 在電腦本地生成ssh,並添加ssh keys到GitHub設置中。如此,電腦可以和GitHub repository進行通信。

    1.ssh-keygen -t rsa -C"[email protected]" #郵箱為GitHub註冊郵箱主要大寫C
    
    2.在本地某個地方生成.ssh文件,打開id_rsa.pub並將其中的字符串添加到GitHub網站SSH keys即可通信
    #ssh也是一個通信標準,這裏是本地電腦和GitHub網站的一個通信,.ssh文件在本地位置無恙
    #通信建立完成了,就這麽簡單
  2. 本地新建文件夾(避免漢字),Git bash here終端切換進去,並執行git初始化。

    1.mkdir myproject
    
    2.cd /home/leng/myproject
    
    3.git init #初始化倉庫,會生成.git文件
    #主要git安裝比較簡單,而且無需更改環境途徑
  3. 在GitHub網頁上新建自己的一個new repository用來儲存我們的myproject項目文件,文件名和本地一致。

    1.直接new repository新建版本倉庫
    #為了方便,取名和本地保持一致吧
  4. 將本地文件推送到GitHub倉庫

    0.提交前事項
    0.1. git add . #將我們的新文件添加至commit
    0.2. git commit -m‘message‘#將內容commit後準備提送
    
    1.git remote add origin [email protected]:lq-jar-head/myproject.git 
    #此處的origin為遠程庫的名字-默認叫法,一看就知道是遠程庫
    #這一本就是將遠程倉庫和本地倉庫綁到一起了
    
    2.git push -u origin master
    #第一次推送,主要-u,以後都沒必要了
    #步驟2也沒有必要,直接在步驟1的基礎上,git push即可
    
    3...多次操作
    git push origin master

方法二

上面是先有本地庫,後有遠程庫,再關聯遠程庫。有另外一個不同的方法,先在GitHub新建一個遠程庫,然後在本地git clone [email protected]:lq-jarhead/heroku.git克隆到本地就可以了。

總結上面普通步驟:

  1. git status 此命令用來查看當前倉庫的情況--新增啊、修改等等
  2. git add . 將新增/修改內容添加進來,進行commit前準備
  3. git commit -m‘message‘ 將新內容進行commit提交
  4. git push 最後的提交了
  5. 以上步驟2-4是最基本最主要的操作了, 更詳細的不談了。

END


前言

本文為本人閱讀廖雪峰教程的總結和筆記,教程見 廖雪峰Git教程

1分布式vs集中式

Git是分布式的版本管理系統,和其他集中式的版本管理系統相比,如SVN,最大的優點是本地管理、多人同時開工,
Git與SVN的主要差別

  1. 這兩個工具主要的區別在於歷史版本維護的位置,Git本地倉庫包含代碼庫還有歷史庫,在本地的環境開發就可以記錄歷史,而SVN的歷史庫存在於中央倉庫,每次對比與提交代碼都必須連接到中央倉庫才能進行。
  2. Git中,自己可以在脫機環境查看開發的版本歷史
  3. 多人開發時如果充當中央倉庫的Git倉庫掛了,任何一個開發者的倉庫都可以作為中央倉庫進行服務,不過開發者倉庫一般不直接充當中央庫,但你可以隨時創建一個新的中央庫然後同步就立刻恢復了中央庫

2基本操作

  1. 在Ubuntu下安裝:sudo apt-get install git ;Windows下就是一個基本軟件的安裝了。
  2. 創建倉庫:在某個文件夾裏面右擊打開git bash here
    1. mkdir learngit #創建文件夾
    2. cd learngit #進入文件夾目錄
    3. pwd #在顯示當前目錄
    4. git init # 初始化
    5. git config --global user.email "xx" #註意yy和name之間的空格
    6. git config --global user.name "yy" #email和name的配置沒有作用,主要本地生成的ssh_key添加到GitHub配置中起作用。
  3. ****提交文件到倉庫及修改、查看更改
    1. 新建readme.txt
    2. git add readme.txt #添加文件到倉庫--精準添加單個文件
    3. git commit -m "this is the first version"#提交文件到倉庫,可以多個一起提交,message用來保存提交的描述信息
    4. 手動改動readme.txt中的內容並保存

    5. git status #查看倉庫的當前狀態,提交修改和新文件一樣需要兩步
    6. git diff #見後面的解釋說明,列出修改的信息
    7. git add readme.txt 上面status和diff可以看到倉庫修改過,就需要再次提交。
    8. git commit -m"the second"
  4. 版本回退:
    1. git log #查看版本詳細的操作記錄情況,方便我們版本回退到那個那個版本。
    2. git reset --hard head^^ #HEAD是當前版本,^^往前兩個版本HEAD~4,回退4個
    3. git reflog #查看所有的版本操作
    4. git reset --hard xxx 回退到未來版本,最常用,xxx為版本號,前面幾個即可--不少於四位,系統自動搜索
    5. 版本向前或向後的回退,顯示獲取各個版本情況,再用命令回到希望的版本。

操作解釋說明:

  • git status 兩個作用,1用來監控工作區文件的增加或減少(文件的改動只有git diff可以查詢出來),2.用來查詢當前版本位置,緩存區有無文件需要commit
  • git diff #比較工作區和緩存區的區別,若commit了,則無返回。但是,改變了readme.txt文件保存後,不用add,用git diff即可返回出哪裏更改了
  • git add readme.txt(git add . #一股腦全加入緩存區),git commit -m"xxx"兩個命令常一起使用。git add xxx可以使用多次,就是將多個文件添加到緩存區,git commit就是將緩存區內容全部提交到repository版本倉庫。

3 工作區和版本庫、緩存區

  • 工作區:working directory工作目錄,就是我們放置文件的目錄,在這裏就是readme.txt所在的目錄,即是我們的工作目錄。
  • 版本庫:repository,版本倉庫,就是.git文件夾,用來儲存各個版本信息
  • 緩存區:版本庫中有一個stage文件夾,就是我們的緩存區

用實際操作說明他們的關系:在工作區我們編輯readme.txt文件並保存,通過git add readme.txt添加到緩存區,再通過git commit -m"xxx"將緩存區所有東西提交到版本庫,就成了一個明確的版本了。

4 管理、撤銷修改和刪除文件等

  • git rm readme.txt#刪除工作區的文件
  • git checkout --readme.txt #"在commit之前,該命令為撤銷刪除",我這裏沒有實現,總是報錯。checkout 就用來回退版本了

5 本地倉庫和遠程倉庫

本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,所以,需要一點設置:

創建本地倉庫:

  • 創建SSH key:$ ssh-keygen -t rsa -C"[email protected]" (win下直接在gitBash中操作,若在Ubuntu中,打開shell)。可以在用戶主目錄裏找到.ssh目錄,裏面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人.
  • 登錄GitHub,create ssh key 並在其中填入我們的公共鑰匙

創建遠程倉庫:

  • 登錄GitHub,create a new repository ,創建一個新的倉庫,命名最好與本地一致
  • 按照提示,在本地倉庫命令欄中輸入git remote add origin [email protected]:lq-jarhead/learngit.git完成添加。

克隆倉庫:

  • 在某個目錄處,打開git shell,此處就是根目錄
  • git clone https://github.com/lq-jarhead/learngit 就是將倉庫復制到此處

6 分支管理:

涉及到分支的創建、合並和刪除,還有解決沖突。比如,我們在同一個readme.txt文件編輯了,最後兩個分支和master合並,就會產生沖突,需要人工解決了。不用糾結太多,分支管理更多用在不同模塊更改吧。

  • git checkout -b xxx#創建並切換到xxx分支 git checkout xxx#就是切換到xxx分支
  • 在Dev分支下,對文件readme.txt進行更改等

  • git add readme.txt
  • git commit -m"lengqian"
  • git checkout master#切換到master
  • git merge --no-ff -m"merge" xxx#將dev分支和當面master合並,no fastforward和-m"共存",為了後期查看具體merge信息。
  • git branch -d xxx#刪除xxx分支 git branch -D xxx#確認刪除(強行刪除)
  • git branch #查看當前目前所有分支,星號標記的為當前分支
  • git log #就可以查看合並記錄了

註意:目前是在master分支,我們創建一個分支test,在其中更改並保存readme.txt,再提交給版本庫。返回到master分支,在其中更改並保存readme.txt,再提交給版本庫。這時候,二者就有沖突的地方了,我們用合並命令就知道沖突在那裏,手動消除沖突後。直接提交給版本庫即可。(這裏不是再次合並,應為第一次已經合並了,盡管有沖突,我們手動消除後就沒有了沖突,直接提交即可!)

7 Bug分支管理

  1. 目前,lengqian正在leng分區上修改
  2. 老大說master有一個bug,需要馬上更改
  3. git stash#將leng分區臨時保存起來
  4. git checkout master#切換到master分區
  5. git checkout -b bug #創建bug分區,用來修改
  6. 修改好了,直接將bug合並到master中
  7. git checkout leng#切換到leng分區
  8. git stash list#可以看到我們的保存的文件
  9. git stash pop#切換為最近一次臨時保存的界面,並刪除stash
  10. 用stash list可以查看stash列表,git stash apply stash@{1}#用來恢復那個版本,

8 多人協作

  1. 大家公用一個遠程倉庫,開發之前git remote -v 查看遠程倉庫的信息。
  2. git clone ... 拷貝至本地,用git branch可以看出只有master分區
  3. git checkout -b dev 創建自己本地的開發分區,並用git push origin dev 推送至倉庫,也是同伴的開發分區基礎
  4. 同伴git pull origin dev#即可將dev分區復制到本地
  5. 在本地dev中修改完成後,用git push origin dev 將本地的dev分區push到遠程倉庫(這個推送之後,也就是合並到遠端的dev中去了)

作者小總結:

  1. 查看遠程庫信息,使用git remote -v,前提是拷貝下來,並且在.git目錄處打開Bash;
  2. 本地新建的分支如果不推送到遠程,對其他人就是不可見的;
  3. 從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交;
  4. 在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
  5. 建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;
  6. 從遠程抓取分支,使用git pull,如果有沖突,要先處理沖突。

註意:多人協作的情況比較復雜,問題關鍵在於遠端倉庫、本人和他,這三個不同的倉庫臨時保存了不同的更改和文件。本人、他,這兩方要分主次,有個為主要的,決定了最終master主分區的操作。9/25/2017 3:44:33 PM

9 標簽tag管理

創建tag標簽,標簽有點類似HEAD,目的是為了用自己語言去給某個commit操作貼上標簽,方便以後查看。有以下幾種方法:

  • 給某個分支貼上標簽,git checkout dev 緊接著git tag v1.0就可以了 git show v1.0就可以查看
  • 給歷史操作貼上標簽,git log找到合適的commit id,git tag v0.9 34mlj 即可
  • 標簽加上說明,git tag -a v1.2 -m"this is v1.2" -a指標簽, - m指說明
  • git tag#查看所有標簽,git show vxx查看xvv標簽

標簽操作

作者小總結:

  • 命令git push origin tagname可以推送一個本地標簽;
  • 命令git push origin --tags可以推送全部未推送過的本地標簽;
  • 命令git tag -d tagname可以刪除一個本地標簽;
  • 命令git push origin :refs/tags/tagname可以刪除一個遠程標簽 #就是替換

註意:tag是全局的,各個分支的tag互相是可以看到的。

10 忽略特殊文件

在版本管理時候,有些文件僅僅自己本地使用,不能提交到GitHub,例如郵箱授權碼、密碼等,這個時候就要借助git特有的.gitignore文件來忽略。".gitignore."用來創建文件,避開“”

方法:在Git工作區的根目錄下創建一個特殊的.gitignore文件,然後把要忽略的文件名填進去,Git就會自動忽略這些文件

忽略原則:

  • 忽略操作系統自動生成的文件,比如縮略圖等;
  • 忽略編譯生成的中間文件、可執行文件等,也就是如果一個文件是通過另一個文件自動生成的,那自動生成的文件就沒必要放進版本庫,比如Java編譯產生的.class文件;
  • 忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件

註意

1.在git中如果想忽略掉某個文件,不讓這個文件提交到版本庫中,可以使用修改根目錄中 .gitignore 文件的方法(如無,則需自己手工建立此文件)。這個文件每一行保存了一個匹配的規則例如:

# 此為註釋 – 將被 Git 忽略

*.cs   # 忽略所有 .cs 結尾的文件
!ABC.cs# 但 ABC.cs 除外
/BLL   # 僅僅忽略項目根目錄下的 BLL 文件,不包括 subdir/BLL
build/ # 忽略 build/ 目錄下的所有文件
doc/*.txt  # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt

規則很簡單,不做過多解釋,但是有時候在項目開發過程中,突然心血來潮想把某些目錄或文件加入忽略規則,按照上述方法定義後發現並未生效,原因是.gitignore只能忽略那些原來沒有被track的文件,如果某些文件已經被納入了版本管理中,則修改.gitignore是無效的。那麽解決方法就是先把本地緩存刪除(改變成未track狀態),然後再提交:

git rm -r --cached .
git add .
git commit -m ‘update .gitignore‘

gitigonre自動生成網址

gitignore_config_fom_github

11 配置別名

簡而言之,就是自定義快捷鍵,節省時間.

git config --alias.co checkout

git config --alias.ci commit

git config --alias.br branch

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" #神器

總結

三天時間看完教程,git的作用就是一個版本的分布式管理,其目的是為了多人更好的協同工作和版本管理。教程也只是簡單的介紹了基本的操作,在工作中常用的命令。在工作中,多操作,會用就行。
9/26/2017 4:15:33 PM

END


Git教程_持續更新