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.lxweimin.com/p/e2f553942317
深入淺出:http://chengshiwen.com/article/head-first-git/
廖雪峰的git學(xué)習(xí)網(wǎng)站:
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
git幾個(gè)概念
版本庫(kù):文件倉(cāng)庫(kù),倉(cāng)庫(kù)里的修改刪除,git都能跟蹤歷史,可以在將來(lái)某個(gè)時(shí)刻還原。
工作目錄:本地項(xiàng)目目錄
暫存區(qū)域:工作目錄和git目錄之間的中轉(zhuǎn)區(qū)(stage或index)
本地倉(cāng)庫(kù)git目錄:本地代碼提交的目錄
git安裝方法
創(chuàng)建版本庫(kù)
方法一:在github中新建項(xiàng)目,git clone下來(lái)
方法二:在本地已有項(xiàng)目里創(chuàng)建版本庫(kù)并關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)
新建遠(yuǎn)程倉(cāng)庫(kù):
方法一:
curl?-u?'username'?https://api.github.com/user/repos-d?'{"name":"RepoName"}'
方法二:在github網(wǎng)頁(yè)版上 右上角“+”號(hào),點(diǎn)擊“New repository”
創(chuàng)建好后會(huì)得到一個(gè)遠(yuǎn)程倉(cāng)庫(kù)鏈接:https://github.com/sunshineMaria/testgit.git
關(guān)聯(lián)本地代碼與遠(yuǎn)程倉(cāng)庫(kù):
cd testgit (進(jìn)入項(xiàng)目目錄)
git init ? ? ? ?(把這個(gè)目錄變成Git可以管理的倉(cāng)庫(kù))
echo?"#?testgit"?>>README.md(新建一個(gè)README.md文件,內(nèi)容為# testgit)
git add . ? ? ?(添加所有工作區(qū)文件到暫存區(qū))
git commit -m 'README.md for this project' ? (提交示例文件到本地倉(cāng)庫(kù))
git remote add origin?https://github.com/sunshineMaria/testgit.git(為本地版本庫(kù)添加名為origin的遠(yuǎn)程版本庫(kù))
git push -u origin master??(執(zhí)行推送命令,完成GitHub版本庫(kù)的初始化。注意命令行中的-u參數(shù),在推送成功后自動(dòng)建立本地分支與遠(yuǎn)程版本庫(kù)分支的追蹤。)
改變項(xiàng)目地址:
git remote set-url origin https://github.com/sunshineMaria/testgit22.git
git remote -v???? 查看遠(yuǎn)程倉(cāng)庫(kù)信息
說(shuō)明:調(diào)用git commit提交至本地的版本庫(kù),調(diào)用git push將本地版本庫(kù)推送至遠(yuǎn)程版本庫(kù)
問(wèn)題:這里的origin和master指什么?
origin是遠(yuǎn)程的意思,master是master分支。git push -u origin master 表示將本地版本庫(kù)推送到遠(yuǎn)程master分支,-u參數(shù)表示在推送成功后自動(dòng)建立本地分支與遠(yuǎn)程版本庫(kù)分支的追蹤。
修改、提交和撤銷
Git的基本工作流程如下:
改動(dòng)文件:在工作目錄中修改、刪除或添加某些文件
暫存文件:對(duì)改動(dòng)后的文件進(jìn)行快照,保存至?xí)捍鎱^(qū)域
提交快照:將保存在暫存區(qū)域的文件快照永久轉(zhuǎn)儲(chǔ)到Git目錄中
git add .??????????????????????????? 將目標(biāo)文件快照加到暫存區(qū)
git commit -m?‘xxx’ ? ? ? ? ?提交快照到本地倉(cāng)庫(kù)
git commit -a -m ‘xx’ ? ? ? ?把所有已修改和已暫存的文件一并提交
git push ? ? ? ? ? ? ? ? ? ? ? ? ?? 將本地版本庫(kù)推送到遠(yuǎn)程版本庫(kù)
git status ? ? ? ? ? ? ? ? ? ? ? ?? 查看修改了哪些文件
git reset HEAD file ? ? ? ? ? ? 撤銷加入暫存區(qū)的文件到工作區(qū)
git checkout file ? ? ? ? ? ? ? ?工作區(qū)的某文件恢復(fù)到和本地版本庫(kù)一樣,工作區(qū)修改會(huì)被拋棄
git reset --hard origin/master ? ? ? ? ?將本地狀態(tài)回退到和遠(yuǎn)程的一樣,修改的代碼將會(huì)被拋棄
git clean -df ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 刪除與版本庫(kù)不同的新建的文件
差異比較
git diff ? ? ? ? ? ? ? ? ? ?? ?????比較工作目錄文件和暫存區(qū)域快照之間的差異(即修改后還沒(méi)有暫存起來(lái)的變化內(nèi)容)
git diff --cached ? ? ? ? ? ?比較暫存區(qū)快照和上次提交之前的差異
git diff?[--] ? ? ? ? ? ? ? ? ? ?比較工作目錄文件和暫存區(qū)快照之間指定文件的差異
git diff --cached [--] ? ?比較暫存區(qū)域快照和上次提交之間指定文件或目錄的差異
git diff HEAD ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?比較工作目錄文件和上次提交的差異
查看提交歷史
git log ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 按提交時(shí)間列出所有更新
git log -p用來(lái)顯示每次提交的內(nèi)容差異
git log -n ? ? ? ? ? ? ? ? ? ? ? ? 查看最近n次提交
git log --stat ? ? ? ? ? ? ? ? ? ? ? 查看每次提交的粗略內(nèi)容
git log 文件名 ? ? ? ? ? ? ? ? ? 只關(guān)心某個(gè)文件的提交歷史
git show 0bce78b ? ? ? ? ? ?查看某次提交的改動(dòng)
git blame 文件名 ? ? ? ? ? ? ? 查看目前文件的每一行是哪個(gè)提交最后改動(dòng)的
git log --author=名字 ? ? ?查看某個(gè)人的提交
git log -1 HEAD 文件名 ? ? 查看文件的最后提交歷史
git log --pretty=online ? ?可以指定使用不同于默認(rèn)格式的方式展示提交歷史,一行展示,顯示commit id和描述
git log --graph ? ? ? ? ? ? ? ?顯示ASCII圖形表示的分支合并歷史,配合—online更為簡(jiǎn)潔
git log --grep ? ? ? ? ? ? ? ? ?搜索提交說(shuō)明中匹配pattern的提交
git log --since, --after ? ? 僅顯示指定時(shí)間之后的提交git?log?--since=2.weeks
git log?—until,--before ? ?僅顯示指定時(shí)間之前的提交
git?log?--pretty=format:"%h?-?%an,?%ar?:?%s"? 定制顯示的記錄的格式
2008 年 10 月期間,提交的但未合并的測(cè)試腳本(位于項(xiàng)目的 t/ 目錄下的文件)
git?log?--pretty="%h?-?%s"? --since="2008-10-01"?\?--before="2008-11-01"?--no-merges?--?t/
Table 2-1.git log --pretty=format常用的選項(xiàng)
選項(xiàng)說(shuō)明
%H ?提交對(duì)象(commit)的完整哈希字串
%h ?提交對(duì)象的簡(jiǎn)短哈希字串
%T ?樹(shù)對(duì)象(tree)的完整哈希字串
%t ??樹(shù)對(duì)象的簡(jiǎn)短哈希字串
%P ?父對(duì)象(parent)的完整哈希字串
%p ?父對(duì)象的簡(jiǎn)短哈希字串
%an ?作者(author)的名字
%ae ?作者的電子郵件地址
%ad ?作者修訂日期(可以用 --date= 選項(xiàng)定制格式)
%ar ?作者修訂日期,按多久以前的方式顯示
%cn ?提交者(committer)的名字
%ce ?提交者的電子郵件地址
%cd ?提交日期
%cr ?提交日期,按多久以前的方式顯示
%s ??提交說(shuō)明
版本切換回退
參考鏈接:
http://yijiebuyi.com/blog/8f985d539566d0bf3b804df6be4e0c90.html
git reset HEAD^ ? ?回退到上一個(gè)版本(本地)
git reset 版本號(hào)???? 回退到某一個(gè)版本
兩種情況:
1.沒(méi)有push
git?reset?[--soft?|?--mixed?|?--hard
默認(rèn)mixed: 保留源碼,只是將git commit和index信息回退到了某個(gè)版本
--soft:保留源碼,只回退到commit信息到某個(gè)版本.不涉及index的回退,如果還需要提交,直接commit即可.
--hard:源碼也會(huì)回退到某個(gè)版本,commit和index 都回回退到某個(gè)版本.(注意,這種方式是改變本地代碼源碼)
當(dāng)然有人在push代碼以后,也使用 reset --hard 回退代碼到某個(gè)版本之前,但是這樣會(huì)有一個(gè)問(wèn)題,你線上的代碼沒(méi)有變,線上commit,index都沒(méi)有變,當(dāng)你把本地代碼修改完提交的時(shí)候你會(huì)發(fā)現(xiàn)全是沖突.....
所以,這種情況你要使用下面的方式
2.已經(jīng)push:回退本地代碼也想同時(shí)回退線上代碼,回滾到某個(gè)指定的版本,線上線下保持一致
git revert 版本號(hào)
git push
分支管理
git branch ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 列出本地所有分支
git branch -a ? ? ? ? ? ? ? ? ? ? ? ?? 列出本地和遠(yuǎn)程
git branch -r ? ? ? ? ? ? ? ? ? ? ? ? ? 列出遠(yuǎn)程所有分支
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???????????????????? 刪除已合并的分支
修改遠(yuǎn)程分支:1.重命名本地分支:git branch -m oldname newname 2.刪除遠(yuǎn)程分支 3.推送本地分支到遠(yuǎn)端
git push origin wxj??????????????????提交wxj分支到遠(yuǎn)程分支
git push --set-upstream origin test???????? 提交代碼到遠(yuǎn)程分支test,并且建立本地分支和遠(yuǎn)程分支關(guān)聯(lián)
git push origin --delete serverfix ? 刪除遠(yuǎn)程分支? ?
git push origin :branch-name? ? ? ?刪除遠(yuǎn)程分支。冒號(hào)前面的空格不能少,原理是把一個(gè)空分支push到server上,相當(dāng)于刪除該分支。
git reflog --date=local | grep?branch-name? ?查看某個(gè)分支的歷史記錄,可以看出該分支的來(lái)源分支
stash儲(chǔ)藏工作現(xiàn)場(chǎng)
git stash??????????????????????儲(chǔ)藏工作現(xiàn)場(chǎng)
git stash apply???????????? 恢復(fù)
git stash drop?????????????? 刪除儲(chǔ)藏的工作現(xiàn)場(chǎng)
git stash pop????????????????恢復(fù)+刪除
解決沖突
分支上該文件修改并提交,master該文件也修改并提交。則合并的時(shí)候一定會(huì)沖突,打開(kāi)沖突代碼合并沖突,重新提交。
解決二進(jìn)制文件沖突
git checkout FILE --ours [ --theirs ]?
刪除文件
rm從工作目錄中刪除指定文件,但不從暫存區(qū)域移除
git rm從版本庫(kù)中刪除該文件 git rm后提交 ?git rm test.txt ? ?git commit -m?‘remove text.txt'
git rm --cached ...:僅僅將文件從暫存區(qū)域中移除(其狀態(tài)變?yōu)槲锤櫍粚?duì)該文件進(jìn)行其它操作
git rm -f ? ? ? ? ? ? ? 強(qiáng)制刪除
git rm -r ? ? ? ? ? ? ??遞歸刪除(用于刪除目錄)
git clean ? ? ? ? ? ? ? 清除未跟蹤文件
git clean -n ? ? ? ? ? 顯示將要清除的文
git clean -f ? ? ? ? ? ?強(qiáng)制清除文件(不包括目錄)
git clean -df ? ? ? ?? 強(qiáng)制清除所有文件和目錄
設(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’?????????????? 最后一次提交信息
可能遇到的問(wèn)題
你的小伙伴已經(jīng)向origin/dev分支推送了他的提交,而碰巧你也對(duì)同樣的文件作了修改,導(dǎo)致push失敗
解決辦法:
git pull把最新提交從遠(yuǎn)程拉下來(lái),然后在本地合并,解決沖突再推送
git pull也失敗
原因是沒(méi)有指定本地dev與遠(yuǎn)程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? ? ? ? 查看某個(gè)git配置
https://ruby-china.org/topics/2423
查看是否已經(jīng)有了ssh密鑰: cd ~/.ssh?? 如果沒(méi)有密鑰則不會(huì)有此文件夾
ssh-keygen -t rsa -C “xxx@gmail.com”????????生成密鑰
按三個(gè)回車,密碼為空,這里一般不適用密鑰
最后得到兩個(gè)文件 id_rsa和id_rsa.pub
注意:密鑰生成就不用改了,如果已經(jīng)生成就到 ~./ssh 文件夾下去找
忽略一些文件、文件夾不提交
在倉(cāng)庫(kù)根目錄下創(chuàng)建名稱為“.gitignore”的文件,寫入不需要的文件夾名或文件,每個(gè)元素占一行即可,如
target
bin
*.db
用戶名郵箱提交錯(cuò)了,修改辦法
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、會(huì)看到Successfully rebased and updated refs/heads/master
8、git push --force ?【有點(diǎn)危險(xiǎn),盡量減少】
上面的操作無(wú)法修改第一次提交,第一次提交用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