Git教程_持續更新
Git教程
更新12/14/2017 5:21:57 PM
更新11/22/2017 6:27:24 PM
寫在前面,在heroku上部署了python web應用,迎合大眾,所有操作都是在Ubuntu上操作。由於git版本管理沒有掌握好,在Ubuntu和Windows上面的命令有一定的不同,造成了迥異的報錯。現整理歸類一下:
方法一
在電腦本地生成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文件在本地位置無恙 #通信建立完成了,就這麽簡單
本地新建文件夾(避免漢字),Git bash here終端切換進去,並執行git初始化。
1.mkdir myproject 2.cd /home/leng/myproject 3.git init #初始化倉庫,會生成.git文件 #主要git安裝比較簡單,而且無需更改環境途徑
在GitHub網頁上新建自己的一個new repository用來儲存我們的myproject項目文件,文件名和本地一致。
1.直接new repository新建版本倉庫 #為了方便,取名和本地保持一致吧
將本地文件推送到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
克隆到本地就可以了。
總結上面普通步驟:
git status
此命令用來查看當前倉庫的情況--新增啊、修改等等git add .
將新增/修改內容添加進來,進行commit前準備git commit -m‘message‘
將新內容進行commit提交git push
最後的提交了- 以上步驟2-4是最基本最主要的操作了, 更詳細的不談了。
END
前言
本文為本人閱讀廖雪峰教程的總結和筆記,教程見 廖雪峰Git教程
1分布式vs集中式
Git是分布式的版本管理系統,和其他集中式的版本管理系統相比,如SVN,最大的優點是本地管理、多人同時開工,
Git與SVN的主要差別:
- 這兩個工具主要的區別在於歷史版本維護的位置,Git本地倉庫包含代碼庫還有歷史庫,在本地的環境開發就可以記錄歷史,而SVN的歷史庫存在於中央倉庫,每次對比與提交代碼都必須連接到中央倉庫才能進行。
- Git中,自己可以在脫機環境查看開發的版本歷史
- 多人開發時如果充當中央倉庫的Git倉庫掛了,任何一個開發者的倉庫都可以作為中央倉庫進行服務,不過開發者倉庫一般不直接充當中央庫,但你可以隨時創建一個新的中央庫然後同步就立刻恢復了中央庫
2基本操作
- 在Ubuntu下安裝:
sudo apt-get install git
;Windows下就是一個基本軟件的安裝了。 - 創建倉庫:在某個文件夾裏面右擊打開git bash here
mkdir learngit
#創建文件夾cd learngit
#進入文件夾目錄pwd
#在顯示當前目錄git init
# 初始化git config --global user.email "xx"
#註意yy和name之間的空格git config --global user.name "yy"
#email和name的配置沒有作用,主要本地生成的ssh_key添加到GitHub配置中起作用。
- ****提交文件到倉庫及修改、查看更改:
- 新建readme.txt
git add readme.txt
#添加文件到倉庫--精準添加單個文件git commit -m "this is the first version"
#提交文件到倉庫,可以多個一起提交,message用來保存提交的描述信息手動改動readme.txt中的內容並保存
git status
#查看倉庫的當前狀態,提交修改和新文件一樣需要兩步git diff
#見後面的解釋說明,列出修改的信息git add readme.txt
上面status和diff可以看到倉庫修改過,就需要再次提交。git commit -m"the second"
- 版本回退:
git log
#查看版本詳細的操作記錄情況,方便我們版本回退到那個那個版本。git reset --hard head^^
#HEAD是當前版本,^^往前兩個版本HEAD~4
,回退4個git reflog
#查看所有的版本操作git reset --hard xxx
回退到未來版本,最常用,xxx為版本號,前面幾個即可--不少於四位,系統自動搜索- 版本向前或向後的回退,顯示獲取各個版本情況,再用命令回到希望的版本。
操作解釋說明:
git status
兩個作用,1用來監控工作區文件的增加或減少(文件的改動只有git diff可以查詢出來),2.用來查詢當前版本位置,緩存區有無文件需要commitgit 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
#切換到mastergit 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分支管理
- 目前,lengqian正在leng分區上修改
- 老大說master有一個bug,需要馬上更改
git stash
#將leng分區臨時保存起來git checkout master
#切換到master分區git checkout -b bug
#創建bug分區,用來修改- 修改好了,直接將bug合並到master中
git checkout leng
#切換到leng分區git stash list
#可以看到我們的保存的文件git stash pop
#切換為最近一次臨時保存的界面,並刪除stash用stash list可以查看stash列表,
git stash apply stash@{1}
#用來恢復那個版本,
8 多人協作
- 大家公用一個遠程倉庫,開發之前
git remote -v
查看遠程倉庫的信息。 git clone ...
拷貝至本地,用git branch可以看出只有master分區git checkout -b dev
創建自己本地的開發分區,並用git push origin dev
推送至倉庫,也是同伴的開發分區基礎- 同伴
git pull origin dev
#即可將dev分區復制到本地 - 在本地dev中修改完成後,用
git push origin dev
將本地的dev分區push到遠程倉庫(這個推送之後,也就是合並到遠端的dev中去了)
作者小總結:
- 查看遠程庫信息,使用git remote -v,前提是拷貝下來,並且在.git目錄處打開Bash;
- 本地新建的分支如果不推送到遠程,對其他人就是不可見的;
- 從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交;
- 在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
- 建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;
- 從遠程抓取分支,使用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教程_持續更新