git
的一些注意事項
- 需要說的是git不同於svn,git是分爲
本地倉庫
與遠程倉庫
的,我們平常的操作都是通過對本地倉庫
完成的
- 只有需要將本地倉庫的內容
push
到遠程倉庫或從遠程倉庫更新
時
纔會和遠程倉庫發生聯繫 - 所以不需要象svn那樣時刻都需要有網才能
commit
,我們可以直接只操作本地倉庫就可以了 - 同時一個文件的狀態對於git來說是存在於
git的工作目錄
, 暫存區
, 本地倉庫
3個狀態的 - 我們使用svn或cvs時 只要從工作目錄
commit
到中心倉庫就可以了 - 但是由於git存在暫存區,所以在git這裏,只有通過
add
命令被添加到暫存區的文件,纔可以commit
到本地倉庫.
關於git
的安裝
- 由於大多數人都是windows的系統 所以我們這裏只列出了windows的安裝,其他系統可以自己度娘
- 可以由http://msysgit.github.io/ 下載相應安裝程序進行安裝 中間的選項默認就好
- 如果你不使用其他git管理工具,請更改如下操作
- msysgit的安裝目錄中的
etc/git-completion.bash
文件增加alias
ls='ls --show-control-chars --color=auto'
- 編輯
etc/gitconfig
在文件中的[core]
部分添加如下部分quotepath
= false
- 在
profile
中增加一行 export
LESSCHARSET=iso8859
- 以上3條操作都是爲了防止一些顯示及提交的中文亂碼等問題
關於git
的配置
git config --global user.name "sampson"
git config --global user.email "[email protected]"
- 可以通過如上命令添加自己的用戶名及郵箱地址
- 每次 git 提交時都會引用這兩條信息,說明是誰提交了更新
--global
選項說明以後你所有的項目都會默認使用這裏配置的用戶信息- 如果要在某個特定的項目中使用其他名字或者郵件,只要
去掉--global
在當前目錄配置即可,新的設定保存在當前項目的.git/config
文件裏 git
config --list
命令用來查看當前的配置.
關於git
的一些基本命令
- git可以新建一個git項目目錄,也可以從已有的git遠程倉庫中
clone
一個項目 - 注意 這不是
checkout
的概念,checkout在git的世界中是切換分支版本
的概念,以後會用到
git
init
對現有的某個項目目錄開始用 git 管理,命令運行後會生成一個名爲 .git 的目錄,所有 git 需要的數據和資源都存放在這個目錄中.git
clone
對已有的遠程倉庫進行clone複製,也會生成 .git目錄
git
add
把文件加入到前面提到的暫存區git
commit
把暫存區中的文件提交到本地倉庫中去git
push
把當前本地倉庫的某個分支推送到遠程倉庫中- 例如
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin ssh://192.168.1.58:10022/doc/gitdoc.git
git push -u origin master
-m
選項爲本次提交的快速註釋方式(沒有提交註釋是不會被git允許的)git
remote add
爲添加一個前文提到的遠程倉庫(需要遠程倉庫創建了此裸倉庫)
- 其中
origin
爲遠程倉庫的別稱,慣例用這個名稱,你也可以根據需要起不同的名字 - 遠程倉庫用到了ssh的方式需要ssh的key存在於遠程倉庫的管理系統中,在gitlab使用中會進行介紹
ssh
key
參見 gitlab 使用說明
- push 命令會把剛纔通過
init
命令新建的本地項目(默認爲master
分支)
push到遠程倉庫
-u
參數是指存在多個遠程倉庫時
指定一個默認主機,這樣後面就可以不加任何參數使用git push- 關於
push
的詳細使用參見git
push 的使用
- 此時 另外一個用戶即可通過
clone
從遠程倉庫下載了
git clone -c http.sslVerify=false https://192.168.1.58/git/doc/gitdoc.git
(注意這裏使用了https,意味着push時需要輸入你在網站註冊的用戶名及密碼)
- 然後我們可以 通過
edit
--> add
--> commit
--> push
的方式進行相應的操作
- 當然我們也可以跳過add ,就是通過選項
–a
- git 就會自動把所有已經跟蹤過的文件暫存起來一併提交,從而跳過 git add 步驟
git commit –a –m 'update xxx'
關於git
的分支相關的命令
- 分支是git的最大魅力,同時實現分支比svn要容易且快速
- 而合併分支又是svn所不具有的功能
git
branch sampson
就會在本地新建一個當前項目的samposn分支
- 我們可以把sampson 想象成windows中的系統還原點,如果我現在什麼都不做
- 我任何時間切換到sampson這個分支都會對應當前的項目狀態,當然前提是在這個分支上沒有做任何提交
- branch
sampson 並不會切換到sampson分支, 我們需要顯式的使用 git checkoutsampson切換到sampson分支
- 當然也可以直接使用 git checkout –b
sampson 創建並切換到sampson分支
git
fetch origin
會抓取遠程倉庫 origin 的更新到本地 包括遠程倉庫的各個分支版本
- 但是注意
fetch
並不會把這些更新融合到你的本地倉庫分支中去.
git
merge origin/master
就是把遠端的master分支 融合到你當前的分支中,如果有衝突 則需要自己解決git
pull
命令是指針對遠程倉庫的分支包含了 fetch 與 merge 合二爲一的一個操作
- 當我們在sampson分支做過一些提交後 我們就可以把這個分支融合到master分支
- 這裏是從master 融合sampson,如果期間master有提交 那麼就會據此產生一個新的版本
- 即master所指向的HEAD 指針會向前進一個版本.git 中分支的融合
git checkout master
git merge sampson
git
rebase master
在sampson分支中git
rebase master sampson
在master分支中
- huaxj 會尋找自己與master的共同祖先節點
- 並把基於這個節點之後的所有差異化操作在master版本上重新演繹一遍
- 然後生成一個HEAD指針在master的下一個版本的節點(同時刪除了自己自共同祖先節點以來的的分支節點)
- 這個節點是sampson分支的,master並沒有改變,如果需要合併還是需要master merge操作
- 但是這樣的操作 會使得版本提交的歷史看起來更流暢與線性
- 還有更重要的一點是在rebase master的過程中,如果有版本衝突,那麼就需要執行rebase的分支進行相應處理
- 這一點在操作遠程倉庫時尤爲明顯, 先在自己的一個本地分支裏進行開發
- 當準備向master提交的時候,根據最新的origin/master 進行一次rebase操作後再提交
- 這樣master維護者就不需要做任何整合工作 直接順利merge
- 等於你替他把他需要處理的可能出現的衝突都已經先擺平了,誰都會喜歡這樣pull request~
rebase
--onto master sampson john1
- 理解方式可以是把 [--onto master] 去掉,即以sampson 和john1的共同祖先rebase john1
- 但目標結果到master上.有點難以理解,可以自己嘗試下
- 但是rebase 有個最大的
潛在問題
就是關係到遠程倉庫的
- 一定
不要
把自己已經提交到遠程倉庫的分支
給rebase掉
- 原因就是上面提到的rebase會刪除自己同rebase目標分支共同祖先節點以來的的分支節點 然後生成一個新的HEAD節點
- 所以如果已經提交到遠程倉庫的分支被rebase掉了,很可能有別人已經基於這個分支做了merge以及新的開發
- 那麼git提交的歷史將變的一片混亂,這種事做出來會人神共憤的
- 我在haxe openfl小組就遇到過這樣的情況,大家會相當崩潰.....
- 因爲過於痛苦,所以master版本及一些重要分支都是鎖定的,只有通過pull request 進行處理
關於git
的其他命令
- 沒有提供詳細的說明 自行度娘吧 另外一些可視化git工具都可以做這些命令的處理
git
rm
命令刪除一個文件,那麼這個文件就會從被跟蹤文件中移除
- 如果只是手動刪除文件那麼git會認爲這個文件發生了改變但未更新
- 其實想想 爲什麼有
git
add
就明白與之對應的要有 git
rm
命令了
git
mv
命令可以進行文件的移動和重命名git
log
命令可以查看詳細的提交歷史,並且提供了過濾選項git
status
命令可以列出修改過的文件git
diff
命令可以查看暫存區與本地目錄文件的區別.git
commit –-amend
命令 用於重新提交,處理上一次提交的錯誤git
reset HEAD
命令用於取消已暫存的文件git
remote –v
可以列出所有的遠程倉庫git
remote show origin
可以查看遠程倉庫的信息git
remote rename aa bb
會把遠程倉庫名aa 變爲bbgit
tag
命令會列出所有標籤git
tag –l '1.0.*'
會列出對應篩選結果git
tag –a v1.0beta –m '1.0 beta'
建立註解標籤git
show v1.0beta
可以查看相關信息git
push origin v1.0beta
標籤如果想要加入到遠程倉庫同樣需要pushgit
push origin --tags
如果新建了多個標籤,也可以一次推送通過如下命令git
reset
版本回退
- 如果你運行一個
git
reset -help
會得到一個比較燒腦的幫助信息 - 這個說起來…. 好吧 太複雜了,我都沒信心看下去,具體需要的時候再查資料吧
- 我基本 只會 而且是很少用到
git
reset --hard commitId
退回某commit 版本git
reset --hard HEAD^
(HEAD ^ 就是父節點 ^ ^ 就是父節點的父節點) 你可能會說,我靠 這要是父節點………N回…- 用
git
reset --hard HEAD~3
就好了 git
reset --hard HEAD^ check.java
只回退某個文件- 以及我以前會最常用的
git
reset --hard origin/master
QQ羣:131783959