2019/12/11更新
git config --system --unset credential.helper 重新輸入賬號密碼
credential: 證明,證件
2019/8/9更新:git rebase 个束,git cherry-pick
- interactive 交互
http://www.reibang.com/p/da7d42139012
(一) 簡介
Git是目前世界上最先進的分布式版本控制系統(tǒng)(沒有之一)。
(1) 集中式和分布式
集中式版本控制系統(tǒng):
集中式版本控制系統(tǒng),版本庫是集中存放在中央服務器的
集中式版本控制系統(tǒng)最大的毛病就是必須聯(lián)網(wǎng)才能工作分布式版本控制系統(tǒng) :
分布式版本控制系統(tǒng)根本沒有“中央服務器”
分布式版本控制系統(tǒng)的安全性要高很多狮惜,比如服務器掛了域帐,不容任何影響
(2) 安裝
(1) 官網(wǎng)下載https://git-scm.com/download/win
(2) 在命令行輸入
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
------------------------
注意git config命令的--global參數(shù)稚铣,表示你這臺機器上所有的Git倉庫都會使用這個配置
當然也可以對某個倉庫指定不同的用戶名和Email地址。
(3) 配置好用戶名和郵箱后铡羡,可以通過 git config --list
來查看所有配置
(3) 創(chuàng)建版本庫
(1) 什么是版本庫:
- 版本庫又名倉庫积蔚,英文名repository,你可以簡單理解成一個目錄烦周,這個目錄里面的所有文件都可以被Git管理起來尽爆,每個文件的修改怎顾、刪除,Git都能跟蹤漱贱,以便任何時刻都可以追蹤歷史槐雾,或者在將來某個時刻可以“還原”。
- repository是倉庫的意思
(2) 創(chuàng)建一個版本庫:
(1) 創(chuàng)建文件夾
$ mkdir aa
$ cd aa
$ pwd
// mkdir: 創(chuàng)建文件夾 ( make )
// rmdir: 刪除文件夾 ( remove )
// touch filename: 在工作區(qū)添加文件 ( 比如:touch one.txt )
// rm filename: 在工作區(qū)刪除文件 ( 比如:rm one.txt )
// cd: 進入文件夾 ( change )
// pwd: 用于顯示當前目錄
// pwd是print working directory的縮寫
如果你使用Windows系統(tǒng)幅狮,為了避免遇到各種莫名其妙的問題募强,請確保目錄名(包括父目錄)不包含中文。
(2) 通過 git init 命令把這個目錄變成Git可以管理的倉庫
- 執(zhí)行 git init 后崇摄,可以發(fā)現(xiàn)當前目錄下多了一個.git的目錄擎值,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄里面的文件
- 如果 .git 目錄被隱藏了逐抑,可以通過
ls -ah
(ls-a ls-ah) 命令來查看 - ls -a 顯示所有的文件鸠儿,包括隱藏文件(以.開頭的文件) -a 是 all 的意思
$ git init
ls :是list的意思
a :是all的意思
ls : 只顯示非隱藏的文件夾。
ls -a : 顯示所有文件和文件夾泵肄,包括隱藏文件和文件夾
ls -al:顯示所有文件和文件夾捆交,包括隱藏文件和文件夾淑翼,并顯示大小腐巢,屬組,創(chuàng)建時間等詳細信息
(3) 把文件放入git倉庫
- (1) 在git倉庫中新建文件玄括,或者復制過來
- (2) 用命令 git add 告訴Git冯丙,把文件添加到倉庫暫存區(qū)
- (3) 用命令 git commit 告訴Git,把文件提交到倉庫遭京,把暫存區(qū)的所有內(nèi)容提交到當前分支
$ git add readme.txt
$ git commit -m "xxxx"
--------------------------------
git commit命令胃惜,-m后面輸入的是本次提交的說明
- 為什么Git添加文件需要add,commit一共兩步呢哪雕?因為commit可以一次提交很多文件船殉,所以你可以多次add不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
--------------------------
$ git add * 添加所有文件到倉庫
(4) 倉庫狀態(tài)
git status命令可以讓我們時刻掌握 -- 倉庫當前的狀態(tài)
git diff 命令可以讓我們時刻掌握 -- 具體修改了什么內(nèi)容
( diff是 difference 的縮寫 )
( modified 是修改的意思 )
( untracked 未被追蹤 )
(5) git diff 用于比較兩次修改的差異
- 比較工作區(qū)與暫存區(qū)
git diff 不加參數(shù)即默認比較工作區(qū)與暫存區(qū)
- 比較工作區(qū)與當前分支
git diff HEAD -- 工作區(qū)的文件名
例如: git diff HEAD -- one.txt // 比較 工作區(qū)的one.txt 和 當前分支中的 one.txt
(6) 提交修改
提交修改和提交新文件是一樣的兩步斯嚎,第一步是git add利虫,再運行git status看看當前倉庫的狀態(tài),第二步是 git commit堡僻,再運行git status看看當前倉庫的狀態(tài)
小結:
要隨時掌握工作區(qū)的狀態(tài)糠惫,使用git status命令。
如果git status告訴你有文件被修改過钉疫,用git diff可以查看修改內(nèi)容硼讽。
(7) git log
git log ---- 查看git的commit信息,每次提交的信息包括注視在內(nèi),從最新提交到最久提交
- git log --pretty=oneline 命令-------------- // 將commit 信息簡化成一行顯示
- git log --graph命令可以看到分支合并圖。 -------------( graph是圖表的意思 )
(8) git reset 版本回退
HEAD 表示當前版本
HEAD^ 表示上一個版本
HEAD^^ 表示上上一個版本
HEAD~100 退回到相對于當前版本的上 100 個版本去
$ git reset --hard HEAD^ 返回上一個版本
或者:
$ git reset --hard ( commit id ) 返回指定版本 // id不需要寫全
(9) git reflog 查看到之前的版本的commit id
git reflog 查看到之前的版本的commit id
- 關閉窗口后牲阁,仍然有效
- 在退回到舊版本之后可以查看舊版本之前的提交日志
- 當我們想從一個舊版本退回到新版本但是我們關閉了shell窗口,不能查看之前的commit id了,就可以通過 $ git reflog 查看到之前的版本的commit id
總結:
HEAD指向的版本就是當前版本固阁,因此壤躲,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id备燃。
穿梭前柒爵,用git log可以查看提交歷史,以便確定要回退到哪個版本赚爵。
要重返未來棉胀,用 git reflog 查看命令歷史,以便確定要回到未來的哪個版本冀膝。
(10) cat命令 ----用于讀取文件的內(nèi)容并進行輸出
- cat 是concatenate 的縮寫唁奢,鏈接的意思
$ cat readme.txt // 讀取readme.txt文件的內(nèi)容,并輸出到命令行
(11) 工作區(qū)和暫存區(qū)
Git的版本庫里存了很多東西窝剖,其中最重要的就是稱為stage(或者叫index)的暫存區(qū)麻掸,還有Git為我們自動創(chuàng)建的第一個分支master,以及指向master的一個指針叫HEAD赐纱。
git版本庫中有很多東西脊奋,最重要的是下面三個:
- 暫存區(qū) stage
- 第一個分支 master
- 指向master分支的指針 HEAD
git add把文件添加進去,實際上就是把文件修改添加到暫存區(qū)疙描;
git commit提交更改诚隙,實際上就是把暫存區(qū)的所有內(nèi)容提交到當前分支。
- cmd命令 創(chuàng)建文件one.txt 并寫入內(nèi)容 one content
(1) 新建文件one.txt
> one.txt
(2) 新建文件one.txt 并且 寫入內(nèi)容 “one content”
echo one content > one.txt
- touch命令 在工作區(qū)新建文件
touch one.txt
(12) 管理修改
Git管理的是修改起胰,當你用git add命令后久又,在工作區(qū)的第一次修改被放入暫存區(qū),準備提交效五,但是地消,在工作區(qū)的第二次修改并沒有放入暫存區(qū),所以畏妖,git commit只負責把暫存區(qū)的修改提交了脉执,也就是第一次的修改被提交了,第二次的修改不會被提交戒劫。
- 每次修改铲掐,如果不add到暫存區(qū)撇眯,那就不會加入到commit中捎琐。
(13) 撤銷修改
git checkout -- filename 撤銷工作區(qū)的修改
git checkout -- filename 的作用是把filename文件在工作區(qū)的修改撤銷到最近一次git add 或 git commit時的內(nèi)容
一種是readme.txt自修改后還沒有被放到暫存區(qū)串远,現(xiàn)在,撤銷修改就回到和版本庫一模一樣的狀態(tài)疯攒;
一種是readme.txt已經(jīng)添加到暫存區(qū)后嗦随,又作了修改,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)枚尼。
checkout是校驗的意思
git checkout -- file命令中的--很重要贴浙,沒有--,就變成了“切換到另一個分支”的命令
總之署恍,就是讓這個文件回到最近一次git commit或git add時的狀態(tài)崎溃。
git reset HEAD filename 撤銷暫存區(qū)的修改,重新放回工作區(qū)
總結:
場景1:當你改亂了工作區(qū)某個文件的內(nèi)容盯质,想直接丟棄工作區(qū)的修改時袁串,用命令`git checkout -- filename`。
場景2:當你不但改亂了工作區(qū)某個文件的內(nèi)容呼巷,還添加到了暫存區(qū)時囱修,想丟棄修改,分兩步王悍,
第一步用命令`git reset HEAD filename`破镰,就回到了場景1,
第二步按場景1操作压储。
場景3:已經(jīng)提交了不合適的修改到版本庫時鲜漩,想要撤銷本次提交。
git reset HEAD^
(14) 刪除文件
rm filename 刪除工作區(qū)文件
git rm filename 刪除版本庫中的文件
- (1) rm filename 刪除工作區(qū)的 文件
- (2) 然后 git status 會提示工作區(qū)文件被刪除
- 接下來
- (3) 如果要從版本庫中刪除該文件集惋,那就用命令git rm刪掉孕似,并且git commit
- (4) 如果要還原工作區(qū)刪除前的狀態(tài) git checkout -- filename 還原到git add 或者 git commit最近一次的狀態(tài)
(二) 遠程倉庫
--- 托管遠程倉庫 github
由于你的本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,所以芋膘,需要一點設置
第1步:創(chuàng)建SSH Key鳞青。
在用戶主目錄下霸饲,看看有沒有.ssh目錄为朋,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件厚脉,如果已經(jīng)有了习寸,可直接跳到下一步。如果沒有傻工,打開Shell(Windows下打開Git Bash)霞溪,創(chuàng)建SSH K
$ssh-keygen -t rsa -C "youremail@example.com"
-
$ssh-keygen -t rsa -C "youremail@example.com" -f ~/.ssh/filename
生成多個ssh-key
用 Git Bash 輸入以下命令:
---
$ ssh-keygen -t rsa -C "youremail@example.com"
---
---
如果需要創(chuàng)建多個ssh key 的話
$ssh-keygen -t rsa -C 'youremail@example.com' -f ~/.ssh/filename
// ( !!!!不加-f filename就會覆蓋 )
---
-t 指定密鑰類型,默認是 rsa 中捆,可以省略鸯匹。
-C 設置注釋文字,比如郵箱泄伪。
-f 指定密鑰文件存儲文件名殴蓬。
你需要把郵件地址換成你自己的郵件地址,然后一路回車蟋滴,使用默認值即可染厅,
由于這個Key也不是用于軍事目的痘绎,所以也無需設置密碼
ssh-keygen 用于為 ssh(1) 生成、管理和轉(zhuǎn)換認證密鑰肖粮,包括 RSA 和 DSA 兩種密鑰孤页。
- 如果一切順利的話,可以在用戶主目錄里找到.ssh目錄涩馆,里面有id_rsa和id_rsa.pub兩個文件行施,這兩個就是SSH Key的秘鑰對,
- id_rsa是私鑰魂那,不能泄露出去悲龟,
- id_rsa.pub是公鑰,可以放心地告訴任何人冰寻。
第2步:登陸GitHub
- 打開“Account settings”须教,“SSSH and GPG keys”頁面:
- 然后,點“New SSH key”斩芭,填上任意Title轻腺,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容:
- 點“Add SSH Key”,你就應該看到已經(jīng)添加的Key:
為什么GitHub需要SSH Key呢划乖?因為GitHub需要識別出你推送的提交確實是你推送的贬养,而不是別人冒充的,而Git支持SSH協(xié)議琴庵,所以误算,GitHub只要知道了你的公鑰,就可以確認只有你自己才能推送迷殿。
當然儿礼,GitHub允許你添加多個Key。假定你有若干電腦庆寺,你一會兒在公司提交蚊夫,一會兒在家里提交,只要把每臺電腦的Key都添加到GitHub懦尝,就可以在每臺電腦上往GitHub推送了知纷。
http://blog.csdn.net/binyao02123202/article/details/20130891
(三) 添加遠程庫
現(xiàn)在的情景是,你已經(jīng)在本地創(chuàng)建了一個Git倉庫后陵霉,又想在GitHub創(chuàng)建一個Git倉庫琅轧,并且讓這兩個倉庫進行遠程同步,這樣踊挠,GitHub上的倉庫既可以作為備份乍桂,又可以讓其他人通過該倉庫來協(xié)作
第一步:點擊+號,new repository 新建倉庫
第二步:填寫 repository 倉庫名稱,和描述
第三步:執(zhí)行以下代碼
git remote add origin https://github.com/woow-wu/git.git
第四布:把本地庫的所有內(nèi)容推送到遠程庫上:
git push -u origin master
// git push -u origin master
// 表示把本地的master分支推送到origin主機master分支模蜡,同時指定origin為默認主機
// -u選項會指定一個默認主機漠趁,這樣后面就可以不加任何參數(shù)使用git push。
由于遠程庫是空的忍疾,我們第一次推送master分支時闯传,加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠程新的master分支卤妒,還會把本地的master分支和遠程的master分支關聯(lián)起來甥绿,在以后的推送或者拉取時就可以簡化命令。
$ git push -u origin master 上面命令將本地的master分支推送到origin主機则披,同時指定origin為默認主機共缕,后面就可以不加任何參數(shù)使用git push了。
不帶任何參數(shù)的git push士复,默認只推送當前分支图谷,這叫做simple方式。此外阱洪,還有一種matching方式便贵,會推送所有有對應的遠程分支的本地分支。Git 2.0版本之前冗荸,默認采用matching方法承璃,現(xiàn)在改為默認采用simple方式。
git push origin 分支名 ------ 將該分支推送到github
git push origin --delete 分支名 ------ 刪除遠程分支
git branch -d 分支名 ------ 刪除本地當前分支xxx
git remote add origin ......... // 添加遠程庫origin
git remote rm origin // 刪除已有的GitHub遠程庫
git push origin 分支名 ------ 將該分支推送到 github 的 origin倉庫 的 xx分支
--------------------------------------------------
git push origin --delete 分支名 ------ 刪除遠程分支
git push origin :分支名 ------ 刪除github遠程分支
(這種方法是推送一個空分支到遠程蚌本,其實就相當于刪除遠程分支)
--------------------------------------------------
git branch -a ------ 查看本地和遠程分支盔粹,遠程分支用紅色表示
git push
git push 命令:把本地庫的內(nèi)容推送到遠程,實際上是把當前分支master推送到遠程程癌。
-u
- -u選項會指定一個默認主機舷嗡,這樣后面就可以不加任何參數(shù)使用git push。
(四) 從遠程庫克隆
git clone
要克隆一個倉庫席楚,首先必須知道倉庫的地址咬崔,然后使用git clone命令克隆。
Git支持多種協(xié)議烦秩,包括https,但通過ssh支持的原生git協(xié)議速度最快郎仆。
git clone https://github.com/woow-wu/git3.git
分支管理
分支的作用
你創(chuàng)建了一個屬于你自己的分支只祠,別人看不到,還繼續(xù)在原來的分支上正常工作扰肌,而你在自己的分支上干活抛寝,想提交就提交,直到開發(fā)完畢后,再一次性合并到原來的分支上盗舰,這樣晶府,既安全,又不影響別人工作钻趋。
主分支
每次提交川陆,Git都把它們串成一條時間線,這條時間線就是一個分支蛮位。截止到目前较沪,只有一條時間線,在Git里失仁,這個分支叫主分支尸曼,即master分支。HEAD嚴格來說不是指向提交萄焦,而是指向master控轿,master才是指向提交的,所以拂封,HEAD指向的就是當前分支解幽。
- HEAD指向當前分支
- master分支 是 主分支
創(chuàng)建分支
(1) git chechout -b 分支名 ------------創(chuàng)建 并 切換 分支
- git checkout
git checkout -b 分支名
// git checkout -b dev
- -b參數(shù) 表示創(chuàng)建并切換,相當于下面兩條命令
$ git branch dev
$ git checkout dev
(2) git branch ------------查看本地分支
git branch ---------- 查看本地分支
git branch -r ------- 查看遠程分支
git branch -a ------- 查看本地和遠程分支所有分支 (遠程分支用紅色標記烘苹,本地當前分支用綠色標記 )
git branch命令查看當前分支
- git branch命令會列出所有分支躲株,當前分支前面會標一個*號。
(3) git branch 分支名 ------------創(chuàng)建分支
- (1) 用
git branch 新分支名
時镣衡,需要在本地有commit時霜定,才會成功 - (2) 用
git checkout -b 新分支名
時,本地沒有commit時廊鸥,也會成功
(4) git branch -d 分支名 ------------刪除本地分支
(5) git branch -D 分支名------------強行刪除分支
(6) git checkout 分支名 ------------切換分支
(7) git merge 指定分支名 ------------合并指定分支到當前分支
- merge 是融入望浩,合并的意思
- Fast-forward信息,Git告訴我們惰说,這次合并是“快進模式”磨德,也就是直接把master指向dev的當前提交,所以合并速度非尺菏樱快典挑。
查看分支:git branch
創(chuàng)建分支:git branch <name>
切換分支:git checkout <name>
創(chuàng)建+切換分支:git checkout -b <name>
合并某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
https://blog.zengrong.net/post/1746.html
解決沖突
當Git無法自動合并分支時,就必須首先解決沖突啦吧。解決沖突后您觉,再提交,合并完成授滓。
用git log --graph命令可以看到分支合并圖琳水。
- graph 是圖表的意思
分支管理策略
git merge --no-ff -m "merge with no-ff" dev
git merge --no-ff -m "merge with no-ff" dev : 表示將目標分支 dev 合并到 當前分支上肆糕,并強制禁用 Fast forward模式,并且提交 commit 在孝,提交說明是 “merge with no-ff”
- 請注意--no-ff參數(shù)诚啃,表示禁用Fast forward
- 為什么要禁用 Fash forward : 因為Fast forward模式下,刪除分支后私沮,會丟掉分支信息
- 合并分支時始赎,加上--no-ff參數(shù)就可以用普通模式合并, 合并后的歷史有分支,能看出來曾經(jīng)做過合并顾彰,而fast forward合并就看不出來曾經(jīng)做過合并极阅。
- 如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit涨享,這樣筋搏,從分支歷史上就可以看出分支信息
- 因為本次合并要創(chuàng)建一個新的commit,所以加上-m參數(shù)厕隧,把commit描述寫進去奔脐。
git log --graph --pretty=oneline --abbrev-commit
- --graph 分支合并圖
- --pretty=oneline 合并到一條信息
- -- abbrev-commit :縮寫commit id,僅顯示 SHA-1 的前幾個字符吁讨,而非所有的 40 個字符
- abbrev 是縮寫的意思
$ git merge --no-ff -m "merge with no-ff" dev
// --no--ff 表示禁用 Fast forward
// 為什么要禁用 Fash forward : 因為Fast forward模式下髓迎,刪除分支后,會丟掉分支信息
// 因為本次合并要創(chuàng)建一個新的commit建丧,所以加上-m參數(shù)排龄,把commit描述寫進去
---------------------------------------------
$ git log --graph --pretty=oneline --abbrev-commit
// --graph 分支合并圖
// --pretty=oneline 合并到一條信息
// -- abbrev-commit :縮寫commit id,僅顯示 SHA-1 的前幾個字符翎朱,而非所有的 40 個字符
// abbrev 是縮寫的意思
在實際開發(fā)中橄维,我們應該按照幾個基本原則進行分支管理:
首先,master分支應該是非常穩(wěn)定的拴曲,也就是僅用來發(fā)布新版本争舞,平時不能在上面干活;
那在哪干活呢澈灼?干活都在dev分支上竞川,也就是說,dev分支是不穩(wěn)定的叁熔,到某個時候委乌,比如1.0版本發(fā)布時,再把dev分支合并到master上者疤,在master分支發(fā)布1.0版本福澡;
你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支驹马,時不時地往dev分支上合并就可以了革砸。
合并分支時,加上--no-ff參數(shù)就可以用普通模式合并
合并后的歷史有分支糯累,能看出來曾經(jīng)做過合并算利,而fast forward合并就看不出來曾經(jīng)做過合并。
Bug分支
git stash
Git還提供了一個stash功能泳姐,可以把當前工作現(xiàn)場“儲藏”起來效拭,等以后恢復現(xiàn)場后繼續(xù)工作
- stash 是隱藏的意思
git stash list
- 查看之前隱藏的工作現(xiàn)場
如何恢復之前隱藏的工作現(xiàn)場
(1) git stash apply---------恢復后,stash內(nèi)容不刪除
-----------------------------------需要用git stash drop刪除
- 一是用git stash apply恢復胖秒,但是恢復后缎患,stash內(nèi)容并不刪除,你需要用git stash drop來刪除阎肝;
(2) git stash pop---------恢復后挤渔,stash內(nèi)容也刪除了
- 另一種方式是用git stash pop,恢復的同時把stash內(nèi)容也刪了
修復bug時风题,我們會通過創(chuàng)建新的bug分支進行修復判导,然后合并,最后刪除沛硅;
當手頭工作沒有完成時眼刃,先把工作現(xiàn)場git stash一下,然后去修復bug摇肌,修復后擂红,再git stash pop,回到工作現(xiàn)場围小。
Feature分支
添加一個新功能時昵骤,你肯定不希望因為一些實驗性質(zhì)的代碼,把主分支搞亂了吩抓,所以涉茧,每添加一個新功能,最好新建一個feature分支疹娶,在上面開發(fā)伴栓,完成后,合并雨饺,最后钳垮,刪除該feature分支。
git branch -D <name>強行刪除
多人協(xié)作
git remote ------- 查看遠程庫的信息
git remote -v ------- 查看遠程庫詳細信息
$ git remote -v
origin https://github.com/woow-wu/git.git (fetch)
origin https://github.com/woow-wu/git.git (push)
上面顯示了可以抓取和推送的origin的地址额港。
如果沒有推送權限饺窿,就看不到push的地址。
$ git push origin master
$ git push origin dev
master分支是主分支移斩,因此要時刻與遠程同步肚医;
dev分支是開發(fā)分支绢馍,團隊所有成員都需要在上面工作,所以也需要與遠程同步肠套;
bug分支只用于在本地修復bug舰涌,就沒必要推到遠程了,除非老板要看看你每周到底修復了幾個bug你稚;
feature分支是否推到遠程瓷耙,取決于你是否和你的小伙伴合作在上面開發(fā)。----------------------新功能分支
創(chuàng)建標簽
git tag ------------ 查看所有標簽
git tag <name> ------------ 打一個新標簽
git show <tagname> ------------ 查看標簽信息
- 還可以通過-s用私鑰簽名一個標簽:
$ git tag -s v0.2 -m "signed version 0.2 released" fec145a
2018/3/27更
vim命令
(1) vim 文件名 ----------------- 用vim打開文件
vim b.txt // 用vim打開 b.txt 文件
(2) 打開文件后刁赖,按 a, i 或 o 進入編輯模式
會在底部命令行顯示 --插入--
(3) ESC 推出編輯模式搁痛,回退到命令模式
在編輯模式下按下ESC 鍵,回退到命令模式
(4) 在命令模式下輸入 :q 和 :wq 和 :q! 和 :w
:w 保存
:q 退出
:wq 保存并退出
:q! 不保存并退出
:w! 強行保存
2018/4/4更
git log 如何退出
q 鍵
在 英文狀態(tài)下 按 q 鍵 ----------- 可以退出 git log 顯示的 commit 記錄
git log --pretty=oneline // 精簡模式
git log -n // 只顯示前 n 條 commit log
git log --stat -n // 顯示前 n 條 commit log宇弛,并顯示每次提交文件的相關數(shù)據(jù)統(tǒng)計
git log --graph // 用圖形顯示log鸡典,可以看到分支合并情況
git log --pretty=format:"%an %.." // 控制顯示的記錄格式
選項 說明
%H 提交對象(commit)的完整哈希字串
%h 提交對象的簡短哈希字串
%T 樹對象(tree)的完整哈希字串
%t 樹對象的簡短哈希字串
%P 父對象(parent)的完整哈希字串
%p 父對象的簡短哈希字串
%an 作者(author)的名字
%ae 作者的電子郵件地址
%ad 作者修訂日期(可以用 -date= 選項定制格式)
%ar 作者修訂日期,按多久以前的方式顯示
%cn 提交者(committer)的名字
%ce 提交者的電子郵件地址
%cd 提交日期
%cr 提交日期涯肩,按多久以前的方式顯示
%s 提交說明
命令可以組合使用
git log --graph
git log -n
git log --pretty=oneline
git log --graph --pretty=oneline -3
git log --graph --pretty=oneline -3 --abbrev-commit ( abbrev是縮寫的意思 )
版本回退
每次( commit )的記錄可以通過 ( git log ) 查看
通過 commit id 就可以回退版本 ------> 工作區(qū)的文件就能和某次提交commit文件時的文件一致
git reset --hard HEAD^ // 回退到上一個版本
git reset --hard HEAD^^ // 回退到上上個版本
git reset --hard HEAD~3 // 回退到往上的第三個版本 即上上上個版本
git reset --hard commit id // 回退到指定commit id 的版本
git reflog
當關掉電腦后 git log 沒有記錄就可以用 git reflog 來打印提交記錄
git reflog // 查看命令歷史
- 生成多個ssh-key
ssh-keygen -t rsa -C '郵箱' -f ~/.ssh/filename
git 新建分支時要注意
(1) 用git branch 新分支名
時轿钠,需要在本地有commit時,才會成功
(2) 用git checkout -b 新分支名
時病苗,本地沒有commit時疗垛,也會成功
(重要)
如果遠程分支A上有修改 ( 或者別人有push ),而對應的本地分支A也有修改硫朦,這時候 git push origin A 就會報錯贷腕,如Updates were rejected because the remote contains work that you do not have locally. This is usually caused by another repository pushing to the same ref. You may want to first integrate the remote changes(e.g., 'git pull ...') before pushing again.
原因就是其他本地庫有push內(nèi)容到遠程相同的分支,( 或者首次是 readme文件在本地沒有咬展,而遠程有 )
-------解決辦法是-------
git pull
在push之前泽裳,先執(zhí)行 git pull 拉取遠程分支內(nèi)容到本地,然后如果有 conflict 就先解決沖突破婆,然后在push到遠程
- conflict 沖突
- integrate 整合,融合
本地分支關聯(lián)遠程分支
$ git branch --set-upstream-to <remote>/<branch> <localbranch>
// 例如: $ git branch --set-upstream-to origin/dev dev
查看遠程庫信息涮总,使用 git remote -v;
本地新建的分支如果不推送到遠程祷舀,對其他人就是不可見的瀑梗;
從本地推送分支,使用git push origin branch-name裳扯,如果推送失敗抛丽,先用git pull抓取遠程的新提交;
在本地創(chuàng)建和遠程分支對應的分支饰豺,
使用git checkout -b branch-name origin/branch-name亿鲜,本地和遠程分支的名稱最好一致;
建立本地分支和遠程分支的關聯(lián)冤吨,使用git branch --set-upstream branch-name origin/branch-name蒿柳;
從遠程抓取分支饶套,使用git pull,如果有沖突其馏,要先處理沖突凤跑。