Git從入門到實戰
什么是 Github?

github是一個基于git的代碼托管平臺,付費用戶可以建私人倉庫,我們一般的免費用戶只能使用公共倉庫,也就是代碼要公開。
Github 由Chris Wanstrath, PJ Hyett 與Tom Preston-Werner三位開發者在2008年4月創辦。迄今擁有59名全職員工,主要提供基于git的版本托管服務。
基本概念
我們先來理解下 Git 工作區、暫存區和版本庫概念:
工作區:就是你在電腦里能看到的目錄。
暫存區:英文叫 stage 或 index。一般存放在?.git?目錄下的 index 文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。
版本庫:工作區有一個隱藏目錄?.git,這個不算工作區,而是 Git 的版本庫。
下面這個圖展示了工作區、版本庫中的暫存區和版本庫之間的關系:
圖中左側為工作區,右側為版本庫。在版本庫中標記為 "index" 的區域是暫存區(stage/index),標記為 "master" 的是 master 分支所代表的目錄樹。
圖中我們可以看出此時 "HEAD" 實際是指向 master 分支的一個"游標"。所以圖示的命令中出現 HEAD 的地方可以用 master 來替換。
圖中的 objects 標識的區域為 Git 的對象庫,實際位于 ".git/objects" 目錄下,里面包含了創建的各種對象及內容。
當對工作區修改(或新增)的文件執行?git add?命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。
當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。
當執行?git reset HEAD?命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。
當執行?git rm --cached
當執行?git checkout .?或者?git checkout --
當執行?git checkout HEAD .?或者?git checkout HEAD
Git 與 SVN 區別
Git 不僅僅是個版本控制系統,它也是個內容管理系統(CMS),工作管理系統等。
如果你是一個具有使用 SVN 背景的人,你需要做一定的思想轉換,來適應 Git 提供的一些概念和特征。
Git 與 SVN 區別點:
1、Git 是分布式的,SVN 不是:這是 Git 和其它非分布式的版本控制系統,例如 SVN,CVS 等,最核心的區別。
2、Git 把內容按元數據方式存儲,而 SVN 是按文件:所有的資源控制系統都是把文件的元信息隱藏在一個類似 .svn、.cvs 等的文件夾里。
3、Git 分支和 SVN 的分支不同:分支在 SVN 中一點都不特別,其實它就是版本庫中的另外一個目錄。
4、Git 沒有一個全局的版本號,而 SVN 有:目前為止這是跟 SVN 相比 Git 缺少的最大的一個特征。
5、Git 的內容完整性要優于 SVN:Git 的內容存儲使用的是 SHA-1 哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。
配置Git
首先在本地創建ssh key;
$ ssh-keygen -t rsa -C "your_email@youremail.com"
后面的your_email@youremail.com改為你在github上注冊的郵箱,之后會要求確認路徑和輸入密碼,我們這使用默認的一路回車就行。成功的話會在~/下生成.ssh文件夾,進去,打開id_rsa.pub,復制里面的key。
回到github上,進入 Account Settings(賬戶配置),左邊選擇SSH Keys,Add SSH Key,title隨便填,粘貼在你電腦上生成的key。
為了驗證是否成功,在git bash下輸入:
$ ssh -T git@github.com
如果是第一次的會提示是否continue,輸入yes就會看到:You've successfully authenticated, but GitHub does not provide shell access 。這就表示已成功連上github。
接下來我們要做的就是把本地倉庫傳到github上去,在此之前還需要設置username和email,因為github每次commit都會記錄他們。
$ git config --global user.name "your name" $ git config --global user.email "your_email@youremail.com"
進入要上傳的倉庫,右鍵git bash,添加遠程地址:
$ git remote add origin git@github.com:yourName/yourRepo.git
后面的yourName和yourRepo表示你再github的用戶名和剛才新建的倉庫,加完之后進入.git,打開config,這里會多出一個remote "origin"內容,這就是剛才添加的遠程地址,也可以直接修改config來配置遠程地址。
創建新文件夾,打開,然后執行?git init?以創建新的 git 倉庫。
檢出倉庫
執行如下命令以創建一個本地倉庫的克隆版本:
git clone /path/to/repository
如果是遠端服務器上的倉庫,你的命令會是這個樣子:
git clone username@host:/path/to/repository
工作流
你的本地倉庫由 git 維護的三棵"樹"組成。第一個是你的?工作目錄,它持有實際文件;第二個是?暫存區(Index),它像個緩存區域,臨時保存你的改動;最后是?HEAD,它指向你最后一次提交的結果。
你可以提出更改(把它們添加到暫存區),使用如下命令:
git add
git add *
這是 git 基本工作流程的第一步;使用如下命令以實際提交改動:
git commit -m "代碼提交信息"
現在,你的改動已經提交到了?HEAD,但是還沒到你的遠端倉庫。
推送改動
你的改動現在已經在本地倉庫的?HEAD?中了。執行如下命令以將這些改動提交到遠端倉庫:
git push origin master
可以把?master?換成你想要推送的任何分支。
如果你還沒有克隆現有倉庫,并欲將你的倉庫連接到某個遠程服務器,你可以使用如下命令添加:
git remote add origin
如此你就能夠將你的改動推送到所添加的服務器上去了。
分支
分支是用來將特性開發絕緣開來的。在你創建倉庫的時候,master?是"默認的"分支。在其他分支上進行開發,完成后再將它們合并到主分支上。
創建一個叫做"feature_x"的分支,并切換過去:
git checkout -b feature_x
切換回主分支:
git checkout master
再把新建的分支刪掉:
git branch -d feature_x
除非你將分支推送到遠端倉庫,不然該分支就是?不為他人所見的:
git push origin
更新與合并
要更新你的本地倉庫至最新改動,執行:
git pull
以在你的工作目錄中?獲取(fetch)?并?合并(merge)?遠端的改動。
要合并其他分支到你的當前分支(例如 master),執行:
git merge
在這兩種情況下,git 都會嘗試去自動合并改動。遺憾的是,這可能并非每次都成功,并可能出現沖突(conflicts)。 這時候就需要你修改這些文件來手動合并這些沖突(conflicts)。改完之后,你需要執行如下命令以將它們標記為合并成功:
git add
在合并改動之前,你可以使用如下命令預覽差異:
git diff
標簽
為軟件發布創建標簽是推薦的。這個概念早已存在,在 SVN 中也有。你可以執行如下命令創建一個叫做?1.0.0?的標簽:
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff?是你想要標記的提交 ID 的前 10 位字符。可以使用下列命令獲取提交 ID:
git log
你也可以使用少一點的提交 ID 前幾位,只要它的指向具有唯一性。
替換本地改動
假如你操作失誤(當然,這最好永遠不要發生),你可以使用如下命令替換掉本地改動:
git checkout --
此命令會使用 HEAD 中的最新內容替換掉你的工作目錄中的文件。已添加到暫存區的改動以及新文件都不會受到影響。
假如你想丟棄你在本地的所有改動與提交,可以到服務器上獲取最新的版本歷史,并將你本地主分支指向它:
git fetch origin
git reset --hard origin/master
實用小貼士
內建的圖形化 git:
gitk
彩色的 git 輸出:
git config color.ui true
顯示歷史記錄時,每個提交的信息只顯示一行:
git config format.pretty oneline
交互式添加文件到暫存區:
git add -i
Git常用命令總結:
git help git ? ? ? ? ? ? ? ?#查看git命令幫助
git config --help ? ? ? ? ? ? #查看config幫助
git config --global user.name 'wsyht' ? ? ? ? ? #設置用戶名標識
git config --global user.email t89191958201@139.com ?#設置郵箱標識
git config --list ? ? ? ? ? ?#查看配置內容
git init ? ? ? ? ? ? ? ? ?#創建版本庫
git add 文件名 ? ? ? ? ? ? ?#添加到暫存區
git commit -m'你描述的內容' ?#提交
git status ?? ? ? ? #查看狀態
git diff ?文件名?? ? #查看文件比較
git log?? ? ? ? ? ?#查看提交的歷史記錄
git log --graph --pretty=oneline --abbrev-commit ? ? #--graph以圖形化顯示,--pretty=oneline省略部分信息輸出,--abbrev-commit則是縮短版本號簡短顯示
git reset --hard HEAD^ ? ? ? #git reset --hard HEAD^
git reset --hard HEAD^^ ? ? ?#git reset --hard HEAD^^
git reset --hard HEAD~100 ? ? #回退到前100個版本
git reflog? ? ? ? ? ? ? #獲取版本號
git reset --hard 版本號 ? ? ?#恢復版本
git checkout -- 文件名 ? ? ? #撤銷工作區的修改
git checkout .? ? ? ? ? ? #撤銷工作區的修改
git reset HEAD 文件名? ? ? ?#轍消暫存區的修改
git remote add origin git@github.com:wsyht/demo_test.git ? #添加遠程url連接
git push -u origin master ? ?#第一次push需要加-u
git remote rm origin ? ? ? #刪除遠程默認倉庫名"origin
git branch?? ? #查看分支
git branch 分支名字 ? ? ? ? ?#創建分支
git checkout 分支名字 ? ? ? ? #切換分支
git checkout -b 分支名字 ? ? ? #創建切換分支
git merge 分支名字 ? ? ? ? ? #合并某分支到當前分支
git branch -d 分支名字 ? ? ? ?#刪除分支
git branch -D wsyht ? ? ? ? ?#大D強制刪除
git stash? ? ? ? ?#儲藏當前修改狀態
git stash list ??? ?#查看儲藏內容
git stash pop ? ? ? #恢復原來修改的狀態
git remote -v ? ? ? #查看遠程庫的詳信息
git pull?? ? ? ? ? ? ?#更新本地工作區
git fetch origin ? ? ? ? #取所有遠程庫的分支到本地
git fetch origin 分支名 ? ?#取某個分支
git branch 分支名 origin/分支名 ? ? ? ? ? ? ?#創建遠程庫的分支到本地
git clone git@github.com:github注冊名/項目名.git ? #克隆GitHub項目到本地
git clone git@server ip:/倉庫路徑/倉庫目錄名字 ? ?#克隆Git服務器項目到本地
git check-ignore -v xx.xx ? ???#查看要添加的那個文件在.gitignore的哪一行設置了忽略
git add -f 文件名 ? ? ? ? ? ?#強制添加此文件到暫存區
it tag v1.0 ??? ? ?? ? ? ?#創建標簽v1.0
git tag v1.1 805dcba ? ? ? ? ?#通過指定他的號碼來給他創建標簽
git tag -a v0.4 -m "我的第三個標簽" e4ace0b ? ?#-a 指定標簽號,-m 指定描述的內容
git tag ? ? ? ? ? ? ? ? ? ? ??? ? ?#查看所有標簽
git tag -d v0.3? ? ? ? ? ? #刪除標簽
git push origin v0.4 ?? ? ? ?#提交單個標簽
git push origin ?--tags ? ? ? #提交所有標簽
git tag -d v0.4? ? ? ? ? ? ?#刪除遠程標簽第一步
git push origin :refs/tags/v0.4??#刪除遠程標簽第二步
git config --global alias.st status ? #把status 配置成別名 st,其他命令設別名依此類推
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
Git GitHub
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。