git學(xué)習(xí)網(wǎng)站:https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5
git學(xué)習(xí)思維導(dǎo)圖:http://www.reibang.com/p/e2f553942317
深入淺出:http://chengshiwen.com/article/head-first-git/
廖雪峰的git學(xué)習(xí)網(wǎng)站:
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
git幾個概念
版本庫:文件倉庫错敢,倉庫里的修改刪除翰灾,git都能跟蹤歷史,可以在將來某個時刻還原稚茅。
工作目錄:本地項目目錄
暫存區(qū)域:工作目錄和git目錄之間的中轉(zhuǎn)區(qū)(stage或index)
本地倉庫git目錄:本地代碼提交的目錄
git安裝方法
創(chuàng)建版本庫
方法一:在github中新建項目纸淮,git clone下來
方法二:在本地已有項目里創(chuàng)建版本庫并關(guān)聯(lián)遠程倉庫
新建遠程倉庫:
方法一:
curl?-u?'username'?https://api.github.com/user/repos-d?'{"name":"RepoName"}'
方法二:在github網(wǎng)頁版上 右上角“+”號,點擊“New repository”
創(chuàng)建好后會得到一個遠程倉庫鏈接:https://github.com/sunshineMaria/testgit.git
關(guān)聯(lián)本地代碼與遠程倉庫:
cd testgit (進入項目目錄)
git init ? ? ? ?(把這個目錄變成Git可以管理的倉庫)
echo?"#?testgit"?>>README.md(新建一個README.md文件峰锁,內(nèi)容為# testgit)
git add . ? ? ?(添加所有工作區(qū)文件到暫存區(qū))
git commit -m 'README.md for this project' ? (提交示例文件到本地倉庫)
git remote add origin?https://github.com/sunshineMaria/testgit.git(為本地版本庫添加名為origin的遠程版本庫)
git push -u origin master??(執(zhí)行推送命令萎馅,完成GitHub版本庫的初始化。注意命令行中的-u參數(shù)虹蒋,在推送成功后自動建立本地分支與遠程版本庫分支的追蹤糜芳。)
改變項目地址:
git remote set-url origin https://github.com/sunshineMaria/testgit22.git
git remote -v???? 查看遠程倉庫信息
說明:調(diào)用git commit提交至本地的版本庫,調(diào)用git push將本地版本庫推送至遠程版本庫
問題:這里的origin和master指什么魄衅?
origin是遠程的意思峭竣,master是master分支。git push -u origin master 表示將本地版本庫推送到遠程master分支晃虫,-u參數(shù)表示在推送成功后自動建立本地分支與遠程版本庫分支的追蹤皆撩。
修改、提交和撤銷
Git的基本工作流程如下:
改動文件:在工作目錄中修改、刪除或添加某些文件
暫存文件:對改動后的文件進行快照扛吞,保存至?xí)捍鎱^(qū)域
提交快照:將保存在暫存區(qū)域的文件快照永久轉(zhuǎn)儲到Git目錄中
git add .??????????????????????????? 將目標(biāo)文件快照加到暫存區(qū)
git commit -m?‘xxx’ ? ? ? ? ?提交快照到本地倉庫
git commit -a -m ‘xx’ ? ? ? ?把所有已修改和已暫存的文件一并提交
git push ? ? ? ? ? ? ? ? ? ? ? ? ?? 將本地版本庫推送到遠程版本庫
git status ? ? ? ? ? ? ? ? ? ? ? ?? 查看修改了哪些文件
git reset HEAD file ? ? ? ? ? ? 撤銷加入暫存區(qū)的文件到工作區(qū)
git checkout file ? ? ? ? ? ? ? ?工作區(qū)的某文件恢復(fù)到和本地版本庫一樣,工作區(qū)修改會被拋棄
git reset --hard origin/master ? ? ? ? ?將本地狀態(tài)回退到和遠程的一樣呻惕,修改的代碼將會被拋棄
git clean -df ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 刪除與版本庫不同的新建的文件
差異比較
git diff ? ? ? ? ? ? ? ? ? ?? ?????比較工作目錄文件和暫存區(qū)域快照之間的差異(即修改后還沒有暫存起來的變化內(nèi)容)
git diff --cached ? ? ? ? ? ?比較暫存區(qū)快照和上次提交之前的差異
git diff?[--] ? ? ? ? ? ? ? ? ? ?比較工作目錄文件和暫存區(qū)快照之間指定文件的差異
git diff --cached [--] ? ?比較暫存區(qū)域快照和上次提交之間指定文件或目錄的差異
git diff HEAD ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?比較工作目錄文件和上次提交的差異
查看提交歷史
git log ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 按提交時間列出所有更新
git log -p用來顯示每次提交的內(nèi)容差異
git log -n ? ? ? ? ? ? ? ? ? ? ? ? 查看最近n次提交
git log --stat ? ? ? ? ? ? ? ? ? ? ? 查看每次提交的粗略內(nèi)容
git log 文件名 ? ? ? ? ? ? ? ? ? 只關(guān)心某個文件的提交歷史
git show 0bce78b ? ? ? ? ? ?查看某次提交的改動
git blame 文件名 ? ? ? ? ? ? ? 查看目前文件的每一行是哪個提交最后改動的
git log --author=名字 ? ? ?查看某個人的提交
git log -1 HEAD 文件名 ? ? 查看文件的最后提交歷史
git log --pretty=online ? ?可以指定使用不同于默認(rèn)格式的方式展示提交歷史,一行展示,顯示commit id和描述
git log --graph ? ? ? ? ? ? ? ?顯示ASCII圖形表示的分支合并歷史,配合—online更為簡潔
git log --grep ? ? ? ? ? ? ? ? ?搜索提交說明中匹配pattern的提交
git log --since, --after ? ? 僅顯示指定時間之后的提交git?log?--since=2.weeks
git log?—until,--before ? ?僅顯示指定時間之前的提交
git?log?--pretty=format:"%h?-?%an,?%ar?:?%s"? 定制顯示的記錄的格式
2008 年 10 月期間,提交的但未合并的測試腳本(位于項目的 t/ 目錄下的文件)
git?log?--pretty="%h?-?%s"? --since="2008-10-01"?\?--before="2008-11-01"?--no-merges?--?t/
Table 2-1.git log --pretty=format常用的選項
選項說明
%H ?提交對象(commit)的完整哈希字串
%h ?提交對象的簡短哈希字串
%T ?樹對象(tree)的完整哈希字串
%t ??樹對象的簡短哈希字串
%P ?父對象(parent)的完整哈希字串
%p ?父對象的簡短哈希字串
%an ?作者(author)的名字
%ae ?作者的電子郵件地址
%ad ?作者修訂日期(可以用 --date= 選項定制格式)
%ar ?作者修訂日期滥比,按多久以前的方式顯示
%cn ?提交者(committer)的名字
%ce ?提交者的電子郵件地址
%cd ?提交日期
%cr ?提交日期亚脆,按多久以前的方式顯示
%s ??提交說明
版本切換回退
參考鏈接:
http://yijiebuyi.com/blog/8f985d539566d0bf3b804df6be4e0c90.html
git reset HEAD^ ? ?回退到上一個版本(本地)
git reset 版本號???? 回退到某一個版本
兩種情況:
1.沒有push
git?reset?[--soft?|?--mixed?|?--hard
默認(rèn)mixed: 保留源碼,只是將git commit和index信息回退到了某個版本
--soft:保留源碼,只回退到commit信息到某個版本.不涉及index的回退,如果還需要提交,直接commit即可.
--hard:源碼也會回退到某個版本,commit和index 都回回退到某個版本.(注意,這種方式是改變本地代碼源碼)
當(dāng)然有人在push代碼以后,也使用 reset --hard 回退代碼到某個版本之前,但是這樣會有一個問題,你線上的代碼沒有變,線上commit,index都沒有變,當(dāng)你把本地代碼修改完提交的時候你會發(fā)現(xiàn)全是沖突.....
所以,這種情況你要使用下面的方式
2.已經(jīng)push:回退本地代碼也想同時回退線上代碼盲泛,回滾到某個指定的版本濒持,線上線下保持一致
git revert 版本號
git push
分支管理
git branch ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 列出本地所有分支
git branch -a ? ? ? ? ? ? ? ? ? ? ? ?? 列出本地和遠程
git branch -r ? ? ? ? ? ? ? ? ? ? ? ? ? 列出遠程所有分支
git branch wxj????????????????????????創(chuàng)建分支 wxj
git checkout -b wxj????????????????創(chuàng)建+切換至
git checkout??wxj??????????????????? 切換分支
git merge wxj??????????????????????????合并某分支到當(dāng)前分支
git branch -D wxj????????????????????刪除未合并的分支
git branch -d wxj???????????????????? 刪除已合并的分支
修改遠程分支:1.重命名本地分支:git branch -m oldname newname 2.刪除遠程分支 3.推送本地分支到遠端
git push origin wxj??????????????????提交wxj分支到遠程分支
git push --set-upstream origin test???????? 提交代碼到遠程分支test,并且建立本地分支和遠程分支關(guān)聯(lián)
git push origin --delete serverfix ? 刪除遠程分支? ?
git push origin :branch-name? ? ? ?刪除遠程分支。冒號前面的空格不能少寺滚,原理是把一個空分支push到server上柑营,相當(dāng)于刪除該分支。
git reflog --date=local | grep?branch-name? ?查看某個分支的歷史記錄村视,可以看出該分支的來源分支
stash儲藏工作現(xiàn)場
git stash??????????????????????儲藏工作現(xiàn)場
git stash apply???????????? 恢復(fù)
git stash drop?????????????? 刪除儲藏的工作現(xiàn)場
git stash pop????????????????恢復(fù)+刪除
解決沖突
分支上該文件修改并提交殉摔,master該文件也修改并提交井濒。則合并的時候一定會沖突额衙,打開沖突代碼合并沖突蛮艰,重新提交。
解決二進制文件沖突
git checkout FILE --ours [ --theirs ]?
刪除文件
rm從工作目錄中刪除指定文件勒虾,但不從暫存區(qū)域移除
git rm從版本庫中刪除該文件 git rm后提交 ?git rm test.txt ? ?git commit -m?‘remove text.txt'
git rm --cached ...:僅僅將文件從暫存區(qū)域中移除(其狀態(tài)變?yōu)槲锤櫍┓睦粚υ撐募M行其它操作
git rm -f ? ? ? ? ? ? ? 強制刪除
git rm -r ? ? ? ? ? ? ??遞歸刪除(用于刪除目錄)
git clean ? ? ? ? ? ? ? 清除未跟蹤文件
git clean -n ? ? ? ? ? 顯示將要清除的文
git clean -f ? ? ? ? ? ?強制清除文件(不包括目錄)
git clean -df ? ? ? ?? 強制清除所有文件和目錄
設(shè)置命令別名
git config --global alias.co?checkout
git config --global alias.st?status
git config --global alias.ci?commit
git config --global alias.unstage ‘reset HEAD --'
git config --global alias.last ‘log -1 HEAD’?????????????? 最后一次提交信息
可能遇到的問題
你的小伙伴已經(jīng)向origin/dev分支推送了他的提交,而碰巧你也對同樣的文件作了修改修然,導(dǎo)致push失敗
解決辦法:
git pull把最新提交從遠程拉下來笛钝,然后在本地合并,解決沖突再推送
git pull也失敗
原因是沒有指定本地dev與遠程dev分支的鏈接愕宋,根據(jù)提示玻靡,設(shè)置dev和origin/dev的鏈接
git branch --set-upstream dev origin/dev
再pull
標(biāo)簽管理
創(chuàng)建和使用git ssh key
首先設(shè)置git的user name和email
git config --global user.name?"XXX"
git config --global user.email "XXX@gmail.com"
git config --list ? ? ? ? ? ? ? ? ? ? ? ?? ?????查看git配置
git config --global user.name? ? ? ? 查看某個git配置
https://ruby-china.org/topics/2423
查看是否已經(jīng)有了ssh密鑰: cd ~/.ssh?? 如果沒有密鑰則不會有此文件夾
ssh-keygen -t rsa -C “xxx@gmail.com”????????生成密鑰
按三個回車,密碼為空中贝,這里一般不適用密鑰
最后得到兩個文件 id_rsa和id_rsa.pub
注意:密鑰生成就不用改了囤捻,如果已經(jīng)生成就到 ~./ssh 文件夾下去找
忽略一些文件、文件夾不提交
在倉庫根目錄下創(chuàng)建名稱為“.gitignore”的文件邻寿,寫入不需要的文件夾名或文件蝎土,每個元素占一行即可,如
target
bin
*.db
用戶名郵箱提交錯了绣否,修改辦法
1誊涯、git rebase -I HEAD~2
2、pick —> edit
3蒜撮、git commit --amend --author=“xx <xx@yy.com>" --no-edit ? ? ?
4暴构、git rebase —continue
5、繼續(xù)?git commit --amend --author=“xx <xx@yy.com>" --no-edit
6、git rebase —continue
7取逾、會看到Successfully rebased and updated refs/heads/master
8耗绿、git push --force ?【有點危險,盡量減少】
上面的操作無法修改第一次提交砾隅,第一次提交用orphan 分支試試
1缭乘、git checkout —orphan source
2、git commit -m ‘init’
3琉用、git branch -m master oldmaster
4、git branch -m source master
5策幼、git branch --set-upstream-to=origin/master master
6邑时、git push -f