不會命令可使用 TortoiseGit 或者 SourceTreegit
git init --bare shared.git (或者 git init)
git config user.name "wangli"
git config user.email "user@qq.com"
git config --global user.name "wangli"
git config --global user.email "user@qq.com"
cat index.jsp
echo "this is test file" > index.jsp
git clone /f/software/repository/git/shared.git/ .
git clone git@github.com:wangli0/appdemo.git .或者 (git clone git@github.com:wangli0/appdemo.git)
mkdir learngit
pwd
//顯示當前路徑git status
未提交
$ git diff readme.txt (diff --> difference)
【使用時機,修改readme.txt,但尚未準備提交(還未add commit),想看看這次修改和上次提交的區別】
提交後
用git diff HEAD -- readme.txt
命令能夠查看工做區和版本庫裏面最新版本的區別github
git status
掌握工做區的狀態git log
(顯示從最近到最遠的提交日誌)
~~~ 若是嫌輸出信息太多,看得眼花繚亂的,能夠試試加上--pretty=oneline~~~ (git log --pretty=oneline)
web
版本回退
git reset --hard HEAD^
或者 指定回退的commit對象的id
($ git reset --hard 3628164)
版本號不必寫全,git會自動找Git中,用HEAD
表示當前版本,上一個版本就是HEAD^
,上上一個版本就是HEAD^^,再往上就是 HEAD~100數據庫
git log
穿梭前,能夠查看提交歷史,以便肯定要回退到哪一個版本git reflog
git checkout -- readme.txt
把readme.txt
文件在工做區的修改所有撤銷
--很重要,沒有的話就變成了「切換到另外一個分支」的命令
兩種狀況
一種是readme.txt自修改後尚未被放到暫存區,
如今,撤銷修改就回到和版本庫如出一轍的狀態;
(還不如再次git pull一次或者 直接vim readme.txt)【改變的是工做區內容】
一種是readme.txt已經添加到暫存區後,又在工做區做了修改xx ,如今,撤銷修改就回到 剛剛git add到暫存區時的狀態暫存區還在bootstrap
git reset HEAD readme.txt
把暫存區的修改撤銷掉(unstage)[暫存區不復存在],從新放回工做區vim
刪除文件(注,git中刪除也是修改操做)
rm index.jsp git rm index.jsp git status git commit -m "remove index.jsp"
安全
github 的使用
因爲你的本地Git倉庫和GitHub倉庫之間的傳輸是經過SSH加密的
需建立 SSH key
$ ssh-keygen -t rsa -C "youremail@example.com"
服務器
touch readme.md
建立一個空文件網絡
重點
不管是
(1)從遠程克隆
(2)或者是本地項目提交到github 都須要先在github上面建立一個倉庫app
(用的多,此種方式連README.md都不能建立【空倉庫】,一旦建立,本地和遠程版本就不一致了,須要先pull才能夠)
方法1省略
方法2
echo # Appdemo >> README.md git initgit add README.md git commit -m "first commit" git remote add origin git@github.com:wangli0/Appdemo.gitgit push -u origin master
注意:用git push命令,其實是把當前分支master推送到遠程。因爲遠程庫是空的,咱們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來
移除關聯 git remote rm origin(若是關聯已經添加,再次添加會報錯)
git checkout -b dev
建立dev分支,-b參數表示 建立並切換
git checkout -b dev
等價於<===>
git branch dev (建立分支 dev) git checkout dev (切換到dev分支) git branch 列出當前的分支
git merge dev // 把dev分支合併到當前分支(默認是Fast-forward快進模式 也就是直接把master 指向dev的當前提交,因此合併速度很是快。) git branch -d dev //如今能夠刪除 dev分支了
git add a.jsp git commit a.jsp -m "the content is a"
git add a.jsp git commit a.jsp -m "the content is aaaa"
$ git merge dev // 衝突產生,兩分支同時修改了一行 , git status查看 衝突的文件
vim a.jsp git add a.jsp git commit -m "conflict fixed" (commit不加文件名哦)
git log --graph --pretty=oneline --abbrev-commit
查看 分支的合併狀況
刪除分支 git branch -d dev
git merge dev(快進模式) git merge --no-ff -m "merge with no-ff" dev
git log --graph --pretty=oneline --abbrev-commit
--no-ff
*** bug分支***
1.正在 dev分支上工做,此時需修復bug
git stash (保存當前的工做區如 修改index.jsp文件或 git add index.jsp文件 可是尚未提交 commit)
- 切換到修復bug的分支 如 master
git checkout master- 建立bug分支
git checkout -b issue-101 (在此上面修復bug)- 修復完成後,切換到master分支,合併分支issue-101,並刪除issue-101分支
git checkout master
git merge --no-ff -m "merged bug fix 101" issue-101
git branch -d issue-101- 是時候接着回到dev分支幹活了
git checkout dev (git status 發現 working directory clean工做區是空的 )- git stash list 查看工做現場存哪裏了
- 恢復工做區
方式1
git stash apply
(恢復後,stash內容並不刪除)
方式2
git stash pop
(恢復的同時把stash內容也刪了)- 你能夠屢次stash,恢復的時候,先用git stash list
查看,而後恢復指定的stash,用命令:
$ git stash apply stash@{0}
標籤
git tag v1.0
(標籤就是快照,在當前最新commit上打了一個快照)
或者針對 某個commit id 打標籤
git tag v1.0 622222
(622222是commit id)
git tag
git show v1.0 (git show <tagname>)
git tag -a v1.0 -m "version1.0的標籤" 6222222
git tag -d v1.0
刪除標籤 (由於建立的標籤都只存儲在本地,不會自動推送到遠程。因此,打錯的標籤能夠在本地安全刪除。)git push origin v1.0
(git push origin
git push origin --tags
//推送本地全部爲推送的 標籤到遠程
git tag -d v1.0 git push origin :refs/tags/v1.0 //注意格式
git config --global color.ui true
//Git顯示顏色,會讓命令輸出看起來更醒目
feature分支(和bug分支,普通分支徹底同樣,主要用於開發新功能)
1.git checkout -b feature-1 新建分支,並編寫完成新功能
- git checkout dev (切換開發分支)
- git branch -d feature-1
一切順利的話,feature分支和bug分支是相似的,合併,而後刪除- 可是不順利事情是常有的(忽然因經費問題被叫停 )
分支尚未被合併,若是刪除,將丟失掉修改,若是要強行刪除,須要使用命令git branch -D feature-1(合併後 的分支刪除方法是git branch -d feature-1 小寫)
丟棄一個沒有被合併過的分支,能夠經過git branch -D
強行刪除
推送分支
git push origin master
// 指定本地分支 master->遠程master
git push origin dev
//指定本地分支 dev ->遠程 dev
遠程庫clone時候 //默認只能clone到遠程分支的master分支
我須要在dev分支上開發,就必須建立遠程origin的dev分支到本地
git checkout -b dev origin/dev
兩人同時push 產生衝突
一樣的一個文件 index.jsp ,兩人都作了修改
人1: 先git push index.jsp -m "update a file"
人2: git push index.jsp -->出現衝突
緣由: 由於你的小夥伴的最新提交和你試圖推送的提交有衝突
解決方案:
人2 : git pull
把最新的提交從origin/dev抓下來,而後,在本地合併,解決衝突,再推送
注意: pull的時候 須要指定 本地 dev分支與 遠程 origin/dev分支的連接git branch --set-upstream dev origin/dev
git remote -v 查看 遠程庫信息
從本地推送分支,使用git push origin branch-name
,若是推送失敗,先用git pull
抓取遠程的新提交
研究發現,如APPdemo文件夾下,git init 初始化本地倉庫
git add ,git commit,都是在當前文件夾下面進行的
只有git push推送到遠程倉庫(或者本機其餘目錄下的倉庫中[也算遠程倉庫,只不過是離線的遠程倉庫])
前提是須要關聯本地倉庫 與遠程倉庫
*** git clone 命令時候 默認會作一次關聯
沒有管理的話,須要咱們本身手動關聯***
可是無論遠程倉庫(net) 遠程倉庫(本機),本地倉庫(某一個文件夾)本質上都是倉庫
當Git沒法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成
master分支是主分支,所以要時刻與遠程同步;
dev分支是開發分支,團隊全部成員都須要在上面工做,因此也須要與遠程同步;
bug分支只用於在本地修復bug,就不必推到遠程了,除非老闆要看看你每週到底修復了幾個bug;
feature分支是否推到遠程,取決於你是否和你的小夥伴合做在上面開發。
標籤是爲了打上版本號信息,固然不能亂叫,一般用:
v1.0, v1.1, v2.0 ...
或者按發佈日期:
build-20150702, build-20150910 ...
若是你想修復bootstrap的一個bug,或者新增一個功能,馬上就能夠開始幹活,幹完後,往本身的倉庫推送。
若是你但願bootstrap的官方庫能接受你的修改,你就能夠在GitHub上發起一個pull request。固然,對方是否接受你的pull request就不必定了。
有些時候,你必須把某些文件放到Git工做目錄中,但又不能提交它們,好比保存了數據庫密碼的配置文件啦,等等,每次git status
都會顯示Untracked files ...
,有強迫症的童鞋內心確定不爽。
好在Git考慮到了你們的感覺,這個問題解決起來也很簡單,在Git工做區的根目錄下建立一個特殊的.gitignore
文件,而後把要忽略的文件名填進去,Git就會自動忽略這些文件。
不須要從頭寫.gitignore
文件,GitHub已經爲咱們準備了各類配置文件,只須要組合一下就可使用了。全部配置文件能夠直接在線瀏覽:https://github.com/github/gitignore
如忽略
Python編譯產生的.pyc
.pyo
.dist
等文件或目錄:
git 工做區 和暫存區 各個分支用的是同一個,僅僅提交的時候因爲指針指的地方不一樣,令咱們感受彷佛在不一樣區間上面工做,且git限定咱們 工做區間被修改(如 index.jsp 被修改或被git add可是未 commit) 此時 git是不容許git checkout (切換分支的)
注意關聯遠程倉庫 和 關聯 遠程分支
**關聯遠程倉庫** git remote add origin git@github.com:wangli0/Appdemo.gitgit **關聯遠程分支** git branch --set-upstream dev origin/dev
==============版本管理員操做========================
第一步: 建立數據倉庫
git init --bare shared.git
==============開發人員1操做=============================
第二步:複製倉庫到本地
git clone /f/software/repository/git/shared.git/ . (注意有個點,代表當前目錄)
第三步:設置我的信息
git config user.name "user1"
git config user.email "user1@163.com"
第四步:忽略無需版本控制的文檔
echo ".txt" > .gitignore
第五步:新建一個文件
echo "User1 add content" > index.jsp
第六步:提交文件
git add index.jsp
git commit -m "User1 add the file"
第七步:把本身的倉庫提交到公共服務器
git push origin master
==============開發人員2操做=============================
第八步:複製倉庫到本地
git clone /f/software/repository/git/shared.git/ .
第九步:設置我的信息
git config user.name "user2"
git config user.email "user2@163.com"
第十步:忽略無需版本控制的文檔
echo ".txt" > .gitignore
第十一步:新建一個文件
echo "User2 add content" >> index.jsp
第十二步:提交文件
git add index.jsp
git commit -m "User2 add the file!"
第十三步:把本身的倉庫提交到公共服務器
git push origin master
==============開發人員1操做=============================
第十四步:下載服務器最新數據
git pull
$ mkdir ~/hello-world //建立一個項目hello-world $ cd ~/hello-world //打開這個項目 $ git init //初始化 $ touch README $ git add README //更新README文件 $ git commit -m 'first commit' //提交更新,並註釋信息「first commit」 $ git remote add origin [git@github.com:defnngj/hello-world.git](mailto:git@github.com:defnngj/hello-world.git) //鏈接遠程github項目 $ git push -u origin master //將本地項目更新到github項目上去
fatal: remote origin already exists.
若是輸入$ git remote add origin
git@github.com:djqiang(github賬號名)/gitdemo(項目名).git
提示出錯信息:fatal: remote origin already exists. 解決辦法以下: 一、先輸入$ git remote rm origin 二、再輸入$ git remote add origin [git@github.com:djqiang/gitdemo.git](mailto:git@github.com:djqiang/gitdemo.git) 就不會報錯
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 config --global alias.last 'log -1'
//等價 git log -1
配置文件
配置Git的時候,加上--global是針對當前用戶起做用的,若是不加,那隻針對當前的倉庫起做用。
配置文件放哪了?每一個倉庫的Git配置文件都放在.git/config文件中
cat .git/config
git stash命令 stash(隱藏,藏匿)
使用場景:
當你接到一個修復一個bug的任務時,建立一個分支issue-101
來修復它,可是當前正在dev
上進行的工做只進行到一半,還無法提交,可是此時 必須在兩個小時內修復該bug,怎麼辦?
Git還提供了一個stash
功能,能夠把當前工做現場「儲藏」起來,等之後恢復現場後繼續工做
使用說明:
使用
git stash
就能夠將你當前未提交到本地(和服務器)的代碼推入到Git的棧中,這時候你的工做區間和上一次提交的內容是徹底同樣的,因此你能夠放心的修 Bug,等到修完Bug,提交到服務器上後,再使用git stash apply
將之前一半的工做 應用回來
也許有的人會說,那我可不能夠屢次將未提交的代碼壓入到棧中?答案是能夠的。
當你屢次使用'git stash'命令後,你的棧裏將充滿了未提交的代碼,這時候你會對將哪一個版本應用回來有些困惑,'git stash list'命令能夠將當前的Git棧信息打印出來,你只須要將找到對應的版本號,
例如使用git stash apply stash@{1}
就能夠將你指定版本號爲stash@{1}的工做取出來,當你將全部的棧都應用回來的時候,可使用'git stash clear'來將棧清空。
在這裏順便提下git format-patch -n , n是具體某個數字, 例如
git format-patch -1
這時便會根據log生成一個對應的補丁,若是 git format-patch -2
那麼便會生成2個補丁,固然前提是你的log上有至少有兩個記錄
看過上面的信息,就能夠知道使用場合了:當前工做區內容已被修改,可是並未完成。
這時Boss來了,說前面的分支上面有一個Bug,須要當即修復。但是我又不想提交目前的修改,由於修改沒有完成。
可是,不提交的話,又沒有辦法checkout到前面的分支。此時用Git Stash就至關於備份工做區 了。
而後在Checkout過去修改,就可以達到保存當前工做區,並及時恢復的做用。