注意git config命令的--global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
//pwd命令用于顯示當前目錄。在我的Mac上,這個倉庫位于/Users/michael/learngit。
$ git init
$ git add readme.txt
$ git add file2.txt file3.txt
$ git commit -m "備注成心義的信息"
$ git status
$ git log 或 $ git log --pretty=oneline //查看提交日志
首先,Git必須知道當前版本是哪一個版本,在Git中,用HEAD表示當前版本,
也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不1樣),
上1個版本就是HEAD^,上上1個版本就是HEAD^^,
固然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。
$ git reset --hard HEAD^ //返回到上1個版本(穿越回去)
$ git reset --hard 3628164 //回到現在以后的某個版本(穿越回來)
$ git reflog
第1步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
第2步是用git commit提交更改,實際上就是把暫存區的所有內容提>交到當前分支。
用git diff HEAD -- readme.txt命令可以查看工作區和版本庫里面最新版本的區分
$ vi xxx.txt 編輯文件 wq保存
$ git checkout -- readme.txt//工作區
$ git reset HEAD readme.txt//暫存區
命令git checkout – readme.txt意思就是,把readme.txt文件在工作區的修改全部撤消,這里有兩種情況:
1種是readme.txt自修改后還沒有被放到暫存區,現在,撤消修改就回到和版本庫1模1樣的狀態;
1種是readme.txt已添加到暫存區后,又作了修改,現在,撤消修改就回到添加到暫存區后的狀態。
總之,就是讓這個文件回到最近1次git commit或git add時的狀態。
git checkout – file命令中的–很重要,沒有–,就變成了“切換到另外一個分支”的命令
$ rm test.txt //文件管理器或命令刪除工作區文件
//下面是刪除版本庫里的
$ git rm test.txt
$ git commit -m "remove test.txt"
第1步:創建SSH Key。在用戶主目錄下,看看有無.ssh目錄,如果有,再看看這個目錄下有無id_rsa和id_rsa.pub這兩個文件,如果已有了,可直接跳到下1步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把郵件地址換成你自己的郵件地址,然后1路回車,使用默許值便可,由于這個Key也不是用于軍事目的,所以也無需設置密碼。
如果1切順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能泄漏出去,id_rsa.pub是公鑰,可以放心腸告知任何人。
第2步:登陸GitHub,打開“Account settings”,“SSH Keys”頁面(這個是有私人倉庫的):
然后,點“Add SSH Key”,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內容:
![]()
點“Add Key”,你就應當看到已添加的Key:
首先,登陸GitHub,然后,在右上角找到“Create a new repo”按鈕,創建1個新的倉庫.
在Repository name填入xxxx,其他保持默許設置,點擊“Create repository”按鈕,就成功地創建了1個新的Git倉庫
目前,在GitHub上的這個xxxx倉庫還是空的,GitHub告知我們,可以從這個倉庫克隆出新的倉庫,也能夠把1個已有的本地倉庫與之關聯,然后,把本地倉庫的內容推送到GitHub倉庫。
現在,我們根據GitHub的提示,在本地的learngit倉庫下運行命令
$ git remote add origin git@github.com:xh2015/testgit.git
添加后,遠程庫的名字就是origin,這是Git默許的叫法,也能夠改成別的,但是origin這個名字1看就知道是遠程庫。
下1步,就能夠把本地庫的所有內容推送到遠程庫上.
$ git push -u origin master
把本地庫的內容推送到遠程,用git push命令,實際上是把當前分支master推送到遠程。
由于遠程庫是空的,我們第1次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或拉取時就能夠簡化命令。
推送成功后,可以立刻在GitHub頁面中看到遠程庫的內容已和本地1模1樣
從現在起,只要本地作了提交,就能夠通過命令:
$ git push origin master
把本地master分支的最新修改推送至GitHub,現在,你就具有了真實的散布式版本庫!
$ git clone https://github.com/xh2015/gitskills.git
$ git checkout -b dev
//相當于
$ git branch dev
$ git checkout dev
======================
$ git branch //查看分支
$ git checkout master //切回master分支
$ git merge dev//合并
$ git branch -d dev //刪除分支
人生不如意之事10之89,合并分支常常也不是1帆風順的。
修改沖突部份以后 add commit
$ git log --graph --pretty=oneline --abbrev-commit //查看分支的合并情況
$ git log --graph //可以看到分支合并圖
通常,合并分支時,如果可能,Git會用Fast forward模式,但這類模式下,刪除分支后,會丟掉分支信息。
如果要強迫禁用Fast forward模式,Git就會在merge時生成1個新的commit,這樣,從分支歷史上就能夠看出分支信息。
準備合并 dev 分支,請注意 –no-ff 參數,表示禁用 Fast forward:
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
由于本次合并要創建1個新的commit,所以加上-m參數,把commit描寫寫進去。
分支策略
在實際開發中,我們應當依照幾個基本原則進行分支管理:
首先,master分支應當是非常穩定的,也就是僅用來發布新版本,平時不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev分支合并到master上,在master分支發布1.0版本;
你和你的小火伴們每一個人都在dev分支上干活,每一個人都有自己的分支,時不時地往dev分支上合并就能夠了。
所以,團隊合作的分支看起來就像這樣:
$ git stash //可以把當前工作現場“蘊藏”起來,等以后恢復現場后繼續工作
工作區是干凈的,剛才的工作現場存到哪去了?用git stash list命令看看:
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
工作現場還在,Git把stash內容存在某個地方了,但是需要恢復1下,有兩個辦法:
$ git stash apply //恢復后,stash內容其實不刪除,你需要用
$ git stash drop //來刪除;
$ git stash pop //恢復的同時把stash內容也刪了
$ git stash apply stash@{0} //恢復指定的1個
軟件開發中,總有沒有窮無盡的新的功能要不斷添加進來。
$ git branch -D feature-vulcan (git branch -D <name>)//強迫刪除分支
$ git remote //查看遠程庫的信息
$ git remote -v //顯示更詳細的信息
推送分支
推送分支,就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上:
$ git push origin master
如果要推送其他分支,比如dev,就改成:
$ git push origin dev
但是,其實不是1定要把本地分支往遠程推送,那末,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要時刻與遠程同步;
dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;
bug分支只用于在本地修復bug,就沒必要推到遠程了,除非老板要看看你每周到底修復了幾個bug;
feature分支是不是推到遠程,取決于你是不是和你的小火伴合作在上面開發。
總之,就是在Git中,分支完全可以在本地自己藏著玩,是不是推送,視你的心情而定!
多人協作
瀏覽: 178355
當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,并且,遠程倉庫的默許名稱是origin。
要查看遠程庫的信息,用git remote:
$ git remote
origin
或,用git remote -v顯示更詳細的信息:
$ git remote -v
origin git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com:michaelliao/learngit.git (push)
上面顯示了可以抓取和推送的origin的地址。如果沒有推送權限,就看不到push的地址。
推送分支
推送分支,就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上:
$ git push origin master
如果要推送其他分支,比如dev,就改成:
$ git push origin dev
但是,其實不是1定要把本地分支往遠程推送,那末,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要時刻與遠程同步;
dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;
bug分支只用于在本地修復bug,就沒必要推到遠程了,除非老板要看看你每周到底修復了幾個bug;
feature分支是不是推到遠程,取決于你是不是和你的小火伴合作在上面開發。
總之,就是在Git中,分支完全可以在本地自己藏著玩,是不是推送,視你的心情而定!
抓取分支
多人協作時,大家都會往master和dev分支上推送各自的修改。
現在,摹擬1個你的小火伴,可以在另外一臺電腦(注意要把SSH Key添加到GitHub)或同1臺電腦的另外一個目錄下克隆:
$ git clone git@github.com:michaelliao/learngit.git
Cloning into 'learngit'...
remote: Counting objects: 46, done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 46 (delta 16), reused 45 (delta 15)
Receiving objects: 100% (46/46), 15.69 KiB | 6 KiB/s, done.
Resolving deltas: 100% (16/16), done.
當你的小火伴從遠程庫clone時,默許情況下,你的小火伴只能看到本地的master分支。不信可以用git branch命令看看:
$ git branch
* master
現在,你的小火伴要在dev分支上開發,就必須創建遠程origin的dev分支到本地,因而他用這個命令創建本地dev分支:
$ git checkout -b dev origin/dev
現在,他就能夠在dev上繼續修改,然后,時不時地把dev分支push到遠程:
$ git commit -m "add /usr/bin/env"
[dev 291bea8] add /usr/bin/env
1 file changed, 1 insertion(+)
$ git push origin dev
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 349 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:michaelliao/learngit.git
fc38031..291bea8 dev -> dev
$ git branch --set-upstream dev origin/dev //設置dev和origin/dev的鏈接
因此,多人協作的工作模式通常是這樣:
1.首先,可以試圖用git push origin branch-name推送自己的修改;
2.如果推送失敗,則由于遠程分支比你的本地更新,需要先用git pull試圖合并;
3.如果合并有沖突,則解決沖突,并在本地提交;
4.沒有沖突或解決掉沖突后,再用git push origin branch-name推送就可以成功!
5.如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch –set-upstream branch-name origin/branch-name。
這就是多人協作的工作模式,1旦熟習了,就非常簡單。
$ git tag v1.0 //git tag <name>就能夠打1個新標簽
$ git tag //可以用命令git tag查看所有標簽
默許標簽是打在最新提交的commit上的。有時候,如果忘了打標簽,比如,現在已是周5了,但應當在周1打的標簽沒有打,怎樣辦?
方法是找到歷史提交的commit id,然后打上就能夠了:
$ git log --pretty=oneline --abbrev-commit
6a5819e merged bug fix 101
cc17032 fix bug 101
7825a50 merge with no-ff
6224937 add merge
59bc1cb conflict fixed
400b400 & simple
75a857c AND simple
fec145a branch test
d17efd8 remove test.txt
...
比方說要對add merge這次提交打標簽,它對應的commit id是6224937,敲入命令:
$ git tag v0.9 6224937
再用命令git tag查看標簽:
$ git tag
v0.9
v1.0
注意,標簽不是按時間順序列出,而是按字母排序的。可以用git show 查看標簽信息
$ git show v0.9
$ git tag -a v0.1 -m "version 0.1 released" 3628164 //用-a指定標簽名,-m指定說明文字
$ git tag -s v0.2 -m "signed version 0.2 released" fec145a //通過-s用私鑰簽名1個標簽
$ git tag -d v0.1 //刪除標簽
創建的標簽都只存儲在本地,不會自動推送到遠程。所以,打錯的標簽可以在本地安全刪除
$ git push origin v1.0 //要推送某個標簽到遠程,使用命令git push origin <tagname>
$ git push origin --tags //1次性推送全部還沒有推送到遠程的本地標簽
標簽已推送到遠程,要刪除遠程標簽就麻煩1點,先從本地刪除
1.$ git tag -d v0.9
2.$ git push origin :refs/tags/v0.9
$ git config --global color.ui true //讓Git顯示色彩,會讓命令輸出看起來更醒目
疏忽文件的原則是:
在工作區創建 .gitignore 文件,添加需要疏忽的內容,例如:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# My configurations:
db.ini
deploy_key_rsa
最后1步就是把.gitignore也提交到Git,就完成了!固然檢驗.gitignore的標準是git status命令是否是說working directory clean。
使用Windows的童鞋注意了,如果你在資源管理器里新建1個.gitignore文件,它會非常弱智地提示你必須輸入文件名,但是在文本編輯器里“保存”或“另存為”就能夠把文件保存為.gitignore了。
有些時候,你想添加1個文件到Git,但發現添加不了,緣由是這個文件被.gitignore疏忽了:
$ git add App.class
The following paths are ignored by one of your .gitignore files:
App.class
Use -f if you really want to add them.
如果你確切想添加該文件,可以用-f強迫添加到Git:
$ git add -f App.class
或你發現,多是.gitignore寫得有問題,需要找出來到底哪一個規則寫錯了,可以用git check-ignore命令檢查:
$ git check-ignore -v App.class
.gitignore:3:*.class App.class
Git會告知我們,.gitignore的第3行規則疏忽了該文件,因而我們就能夠知道應當修訂哪一個規則。
$ git config --global alias.st status //告知Git,以后st就表示status
固然還有別的命令可以簡寫,很多人都用co表示checkout,ci表示commit,br表示branch
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
//提交就能夠簡寫成:
$ git ci -m "bala bala bala..."
$ git config --global alias.unstage 'reset HEAD'//當你 $ git unstage test.py 時候等于 $ git reset HEAD test.py
$ git config --global alias.last 'log ⑴' → $ git last == $ git log ⑴ //查看最后1次提交信息
乃至還有人喪心病狂地把lg配置成了:
$ 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 lg 效果:
配置Git的時候,加上–global是針對當前用戶起作用的,如果不加,那只針對當前的倉庫起作用。
配置文件放哪了?每一個倉庫的Git配置文件都放在.git/config文件中:
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:michaelliao/learngit.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[alias]
last = log ⑴
別名就在[alias]后面,要刪除別名,直接把對應的行刪掉便可。
而當前用戶的Git配置文件放在用戶主目錄下的1個隱藏文件.gitconfig中:
$ cat .gitconfig
[alias]
co = checkout
ci = commit
br = branch
st = status
[user]
name = Your Name
email = your@email.com
配置別名也能夠直接修改這個文件,如果改錯了,可以刪掉文件重新通過命令配置。
$ git config --list | grep alias 或 git config --get-regexp alias//查看別名
$ git config --global --unset alias.st //取消別名
假定你已有sudo權限的用戶賬號,下面,正式開始安裝。
第1步,安裝git:
$ sudo apt-get install git
第2步,創建1個git用戶,用來運行git服務:
$ sudo adduser git
第3步,創建證書登錄:
搜集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub文件,把所有公鑰導入到/home/git/.ssh/authorized_keys文件里,1行1個。
第4步,初始化Git倉庫:
先選定1個目錄作為Git倉庫,假定是/srv/sample.git,在/srv目錄下輸入命令:
$ sudo git init --bare sample.git
Git就會創建1個裸倉庫,裸倉庫沒有工作區,由于服務器上的Git倉庫純潔是為了同享,所以不讓用戶直接登錄到服務器上去改工作區,并且服務器上的Git倉庫通常都以.git結尾。然后,把owner改成git:
$ sudo chown -R git:git sample.git
第5步,禁用shell登錄:
出于安全斟酌,第2步創建的git用戶不允許登錄shell,這可以通過編輯/etc/passwd文件完成。找到類似下面的1行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改成:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
這樣,git用戶可以正常通過ssh使用git,但沒法登錄shell,由于我們為git用戶指定的git-shell每次1登錄就自動退出。
第6步,克隆遠程倉庫:
現在,可以通過git clone命令克隆遠程倉庫了,在各自的電腦上運行:
$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就簡單了。
管理公鑰
如果團隊很小,把每一個人的公鑰搜集起來放到服務器的/home/git/.ssh/authorized_keys文件里就是可行的。如果團隊有幾百號人,就沒法這么玩了,這時候,可以用Gitosis來管理公鑰。
這里我們不介紹怎樣玩Gitosis了,幾百號人的團隊基本都在500強了,相信找個高水平的Linux管理員問題不大。
管理權限
有很多不但視源代碼如生命,而且視員工為竊賊的公司,會在版本控制系統里設置1套完善的權限控制,每一個人是不是有讀寫權限會精確到每一個分支乃至每一個目錄下。由于Git是為Linux源代碼托管而開發的,所以Git也繼承了開源社區的精神,不支持權限控制。不過,由于Git支持鉤子(hook),所以,可以在服務器端編寫1系列腳本來控制提交等操作,到達權限控制的目的。Gitolite就是這個工具。
這里我們也不介紹Gitolite了,不要把有限的生命浪費到權限斗爭中。
小結
搭建Git服務器非常簡單,通常10分鐘便可完成;
要方便管理公鑰,用Gitosis;
要像SVN那樣變態地控制權限,用Gitolite。
ubuntu中超級管理員的獲得
1.在終端中輸入:
sudo passwd root
Enter new UNIX password: (在這輸入你的密碼)
Retype new UNIX password: (肯定你輸入的密碼)
passwd: password updated successfully
以后,如果在想取得root權限,只需進行以下的操作:
su root
Password: (在此輸入你上面設置的密碼)
如果要再次禁用 root 帳號,
那末可以履行
sudo passwd -l root
2.在命令行里,輸入
sudo nautilus
以后輸入你的用戶的密碼,會彈出1個目錄窗口來,可以復制到這里來的,在這里也能夠刪掉root的文件.
這個是圖形界面。
學習:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000