Git學習筆記

2017.9.14
Git學習筆記
Git
Git是一個免費並且開源的分佈式版本控制系統,最初由林納斯·託瓦茲(Linus Torvalds)創作,於2005年以GPL發佈。最初目的是爲更好地管理Linux內核開發而設計。如今,Git已成爲最受開發者歡迎的版本控制系統。
自從用了Git,修改文件再也不用命名成file1,file2,file2改進版,file最終版…
注意: 所有的版本控制系統,只能跟蹤文本文件的改動,比如TXT文件,網頁,所有的程序代碼等等。而圖片、視頻這些二進制文件,沒法跟蹤文件的變化,也就是隻知道圖片從100KB改成了120KB。Git跟蹤並管理的是修改,而非文件。
Notes
1.創建版本庫
創建一個空目錄,然後通過git init命令把這個目錄變成Git可以管理的倉庫:
$ mkdir learngit$ cd learngit$ git initInitialized empty Git repository in /Users/michael/learngit/.git/
2.添加和提交
把一個文件放到Git倉庫只需要兩步:
  • git add <file>...: 將文件添加到倉庫
  • git commit -m "message": 將文件提交到倉庫
工作區有一個隱藏目錄.git,是Git的版本庫,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD
git add之前若需撤銷修改,用git checkout -- <file>...命令。
git add實際上就是把文件修改添加到暫存區,逆操作是unstagegit reset HEAD <file>...
git add
git commit實際上就是把暫存區的所有內容提交到當前分支,逆操作是git reset --hard HEAD^
git commit
3.版本回退
  • git status: 查看倉庫當前的狀態
  • git diff: 查看具體修改內容
  • git log: 查看版本變化的歷史紀錄
  • git reset --hard HEAD^/commit id: 回退到指定版本
使用git log命令時,一大串類似3628164...882e1e0的是commit id(版本號)
$ git logcommit 3628164fb26d48395383f8f31179f24e0882e1e0Author: Michael Liao <[email protected]>Date: Tue Aug 20 15:11:49 2013 +0800append GPL
在Git中,用HEAD表示當前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100,也可指定commit id
$ git reset --hard HEAD^HEAD is now at ea34578 add distributed$ git reset --hard 3628164HEAD is now at 3628164 append GPL
Git的版本回退速度非常快,因爲Git在內部有個指向當前版本的HEAD指針,當你回退版本的時候,Git僅僅是改變HEAD指針的指向。
4.遠程庫(Github)
由於本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,在使用Github之前,需先進行以下設置:
  1. 創建SSH Key:$ ssh-keygen -t rsa -C "[email protected]"
  2. 用戶主目錄下里找到.ssh目錄,裏面有id_rsaid_rsa.pub兩個文件,登陸GitHub,打開“SSH Keys”頁面:在Key文本框裏粘貼id_rsa.pub文件的內容。
添加遠程庫
如果本地庫有內容,而遠程庫沒有內容,則在Github上“Create a new repo”,然後將本地倉庫與之關聯,這樣就可以把本地倉庫的內容推送到GitHub倉庫了。
$ git remote add origin [email protected]:michaelliao/learngit.git$ git push -u origin master

修改遠程庫
格式:
git remote set-url origin xxxx xxxx代表自己的本地倉庫路徑
例子:
git remote set-url origin [email protected]:CinccLiBF/clom.git
從遠程庫克隆
如果遠程庫有內容,而本地庫沒有內容,則直接從遠程庫克隆。
$ git clone [email protected]:michaelliao/gitskills.git
從遠程庫pull
如果遠程庫與本地庫都有內容,並且存在衝突,則本地庫無法向遠程庫push,解決辦法很簡單,先用git pull把最新的提交從origin/master抓下來,然後,在本地合併,解決衝突,再推送。
$ git pullfix conflicts...$ git push origin master
5.分支管理
每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。創建版本庫時自動創建master主分支。創建新的分支dev時,Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上。當dev上的工作完成了,直接把master指向dev的當前提交,就可以把dev合併到master上。
  • git branch: 查看分支
  • git branch <name>: 創建分支
  • git checkout <name>: 切換分支
  • git checkout -b <name>: 創建+切換分支
  • git merge <name>: 合併某分支到當前分支
  • git branch -d <name>: 刪除分支
  • git branch -D <name>: 強行刪除沒有被合併過的分支
master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活;幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本;小夥伴們每個人都在dev分支上幹活,每個人都有自己的分支,時不時地往dev分支上合併就可以了。所以,團隊合作的分支看起來就像這樣:
git commit
Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以後恢復現場後繼續工作。
# 保存工作現場$ git stashSaved working directory and index state WIP on dev: 6224937 add mergeHEAD is now at 6224937 add merge# 查看工作現場列表$ git stash liststash@{0}: WIP on dev: 6224937 add merge# 恢復工作現場方法1$ git stash pop# 恢復工作現場方法2$ git stash apply stash@{0}...$ git stash drop
6.自定義Git
忽略特殊文件
在Git工作區的根目錄下創建一個特殊的.gitignore文件,然後把要忽略的文件名填進去,Git就會自動忽略這些文件。
# MacOS X:.DS_Store# Python:*.py[cod]*.so# My Config:*.txt
配置別名
例如,用git st表示git status命令,git br表示git branch命令…:
$ git config --global alias.st status$ git config --global alias.co checkout$ git config --global alias.cm commit$ git config --global alias.br branch$ git config --global alias.unstage 'reset HEAD'$ git config --global alias.last 'log -1'$ 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的時候,加上--global是針對當前用戶起作用的,如果不加,那隻針對當前的倉庫起作用。每個倉庫的Git配置文件都放在.git/config文件中。而當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig中:
$ cat .gitconfig[alias] co = checkout ci = commit br = branch st = status[user] name = Your Name email = [email protected]
配置別名也可以直接修改這個文件,如果改錯了,可以刪掉文件重新通過命令配置。
  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章