我的常用:
===================================
** 撤銷工作修改:**
1、git checkout
2、git reset --hard
回滾并提交到某個版本號
git cherry-pick 29d4fa6
===================================
1.創(chuàng)建倉庫
mkdir gitTest
cd gitTest ——創(chuàng)建/home/XXX/gitTest空目錄
2.通過git init命令把這個目錄變成Git可以管理的倉庫:
git init ——初始化Git倉庫
3.用命令git add告訴Git,把文件添加到倉庫(實際上就是把文件修改添加到暫存區(qū)):
git add filename
4.用命令git commit告訴Git,把文件提交到倉庫(實際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支):
git commit -m "有意義的附加說明"
5.隨時掌握工作區(qū)的狀態(tài)
git status
6.查看文件被修改的內(nèi)容
git diff
7.查看代碼的歷史版本號
git log
git log --pretty=oneline ——要求版本信息只能在一行中顯示
8.HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們在版本的歷史之間穿梭
git reset --hard commit_id
或git reset --hard HEAD(HEAD^等等)
9.查看命令歷史,以便確定要回到未來的哪個版本
git reflog
10.弄明白Git的工作區(qū)(當(dāng)前分區(qū))和暫存區(qū)
11.理解Git是如何跟蹤修改的,每次修改,如果不add到暫存區(qū),那就不會加入到commit中
12.撤銷修改
命令git checkout -- filename
意思就是,把filename文件在工作區(qū)的修改全部撤銷,這里有兩種情況:
- 一種是filename自修改后還沒有被放到暫存區(qū),現(xiàn)在,撤銷修改就回到和版本庫一模一樣的狀態(tài);
- 一種是filename已經(jīng)添加到暫存區(qū)后,又作了修改,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。
總之,就是讓這個文件回到最近一次git commit或git add時的狀態(tài)。
- 場景1:當(dāng)你改亂了工作區(qū)某個文件的內(nèi)容,想直接丟棄工作區(qū)的修改時,用命令git checkout -- file。
git checkout其實是用版本庫里的版本替換工作區(qū)的版本,無論工作區(qū)是修改還是刪除,都可以“一鍵還原”。 - 場景2:當(dāng)你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
- 場景3:已經(jīng)提交了不合適的修改到版本庫時,想要撤銷本次提交,版本回退,不過前提是沒有推送到遠程庫。
13.刪除文件
命令git rm用于刪除一個文件。如果一個文件已經(jīng)被提交到版本庫,那么你永遠不用擔(dān)心誤刪,但是要小心,你只能恢復(fù)文件到最新版本,你會丟失最近一次提交后你修改的內(nèi)容。
14.將本地倉庫與github倉庫關(guān)聯(lián)起來
往里面添加文件:
touch README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin
git@github.com:sysublackbear/Learmgitfirst.git
git push -u origin master
將本地倉庫同步github倉庫:
- 1 git remote add origin git@github.com:sysublackbear/Learmgitfirst.git
- 2 git push -u origin master
然后,從現(xiàn)在起,只要本地作了提交,就可以通過命令:
1 git push origin master
把本地master分支的最新修改推送至GitHub
15.多人協(xié)作一個項目的時候,我們每個人可以通過從遠程倉庫克隆一份來作為己用。
1 git clone git@github,com:sysublackbear/XXXX.git
16.創(chuàng)建分支并且切換到分支
1 git checkout -b dev2 Switched to a new branch 'dev'
等價于:
1 git branch dev2 git checkout dev3 Switched to branch 'dev'
查看分支:
1 git branch
將次分支合并到主分支上面:
1 git merge dev
刪除分支:
1 git branch -d dev2 Deleted branch dev (was fec145a).
17.解決沖突
當(dāng)Git無法自動合并分支時,就必須首先解決沖突。解決沖突后,再提交,合并完成。
用git log --graph命令可以看到分支合并圖。
18.Bug修復(fù)
修復(fù)bug時,我們會通過創(chuàng)建新的bug分支進行修復(fù),然后合并,最后刪除;
當(dāng)手頭工作沒有完成時,先把工作現(xiàn)場git stash一下,然后去修復(fù)bug,修復(fù)后,再git stash pop,回到工作現(xiàn)場
19.開發(fā)新功能
開發(fā)一個新功能,最好新建一個分支;
如果要丟棄一個沒有被合并過的分支,可以通過git branch -D name強行刪除。
20.參與開源項目先要克隆一份到本地
1 git clone git@github.com:michaelliao/bootstrap.git
====== git總結(jié)文章 ======
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幾個概念
版本庫:文件倉庫,倉庫里的修改刪除,git都能跟蹤歷史,可以在將來某個時刻還原。
工作目錄:本地項目目錄
暫存區(qū)域:工作目錄和git目錄之間的中轉(zhuǎn)區(qū)(stage或index)
本地倉庫git目錄:本地代碼提交的目錄
git安裝方法
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137396287703354d8c6c01c904c7d9ff056ae23da865a000
創(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 originhttps://github.com/sunshineMaria/testgit.git(為本地版本庫添加名為origin的遠程版本庫)
git push -u origin master (執(zhí)行推送命令,完成GitHub版本庫的初始化。注意命令行中的-u參數(shù),在推送成功后自動建立本地分支與遠程版本庫分支的追蹤。)
改變項目地址:
git remote set-url originhttps://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 -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 刪除已合并的分支
git push origin wxj 提交wxj分支到遠程分支
git push --set-upstream origin test 提交代碼到遠程分支test,并且建立本地分支和遠程分支關(guān)聯(lián)
stash儲藏工作現(xiàn)場
git stash 儲藏工作現(xiàn)場
git stash apply 恢復(fù)
git stash drop 刪除儲藏的工作現(xiàn)場
git stash pop 恢復(fù)+刪除
解決沖突
分支上該文件修改并提交,master該文件也修改并提交。則合并的時候一定會沖突,打開沖突代碼合并沖突,重新提交。
刪除文件
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
文/sunshine_Maria(簡書作者)原文鏈接:http://www.lxweimin.com/p/bcd155258985著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”。