Part1:CentOS6.5免密碼登錄
修改/etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile /root/.ssh/authorized_keys
啟用這三行,然后重啟service sshd restart
設置.ssh目錄權限
chmod 700 -R .ssh
如果你想要每台機子都無密碼登錄,那么把每台機子產生的密鑰添加到文件中(這是在受控端機子上面執行的)
cat id_rsa.pub >> .ssh/authorized_keys
如果遇到登錄失敗的情況:我用的是centos版本是6.5,centos6.5對網絡管理相當嚴格,需要在原來的基礎上關閉selinux, 到/etc/selinux/config下,把SELINUX=enforcing修改為SELINUX=disabled,重啟機器,ok
Part2:SSH私鑰取消密碼(passphrase)
搞定rsync多台機器之間同步文件之后發現以前使用的ssh密鑰是有密碼的,這樣每次同步時候還需要手動輸入一次密碼才可以。
Google后有人提示可以使用.bash_profile配合ssh-agent來實現每次自動加載密鑰到內存中,省去輸入密碼的環節,但.bash_profile有各種弊端,有人專門寫了一個叫做keychain的小軟件來解決ssh-agent 的不足。
但實際使用的時候依然不是很順手,就干脆取消了私鑰中的密碼:
1. 使用openssl命令去掉私鑰的密碼openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa_new
2. 備份舊私鑰mv ~/.ssh/id_rsa ~/.ssh/id_rsa.backup
3. 使用新私鑰mv ~/.ssh/id_rsa_new ~/.ssh/id_rsa
4. 設置權限chomd 600 ~/.ssh/id_rsa
取消掉原私鑰的密碼,配合cron計划任務定時同步文件就可以保證多台服務器文件自動更新了。而且只要注意私鑰不泄漏出去,多台服務器之間無密碼登錄也方便很多。
Part3:git查看修改用戶名和郵箱地址
GIT 查看/修改用戶名和郵箱地址
用戶名和郵箱地址的作用
用戶名和郵箱地址是本地git客戶端的一個變量,不隨git庫而改變。
每次commit都會用用戶名和郵箱紀錄。
github的contributions統計就是按郵箱來統計的。
查看用戶名和郵箱地址:
$ git config user.name
$ git config user.email
修改用戶名和郵箱地址:
$ git config --global user.name "username"
$ git config --global user.email "email"
Part4:SSH 登錄時出現如下錯誤:Disconnected:No supported authentication methods available
問題現象
當您通過 SSH 客戶端登錄 ECS Linux 實例時,輸入正確的賬號密碼,也會出現類似如下錯誤信息。
Symptom
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
sshd[10826]: Connection closed by XX.XX.XX.XX.
Disconnected: No supported authentication methods available.
原因分析
參數 PasswordAuthentication 的默認值為 yes,SSH 服務將其值置為 no 以禁用密碼驗證登錄,導致此類故障。需要修改 PasswordAuthentication 配置解決此問題。
解決方法
建議在修改配置文件之前 創建快照 備份數據。以 CentOS 6.8 為例:
通過 管理終端 連接並登錄到 Linux 實例。
執行命令 cat /etc/ssh/sshd_config 查看 SSH 服務配置,並注意是否包含類似如下配置:
Config
執行命令 vi /etc/ssh/sshd_config,按下 i 編輯 SSH 服務配置文件,將參數 PasswordAuthentication 設置為 yes,或者在 PasswordAuthentication 參數前添加井號(#),按下 Esc 退出編輯模式,並輸入 :wq 保存退出。
Shooting
執行命令 service ssh restart 重啟 SSH 服務。
Part5:用 Git Hooks 進行自動部署
遠程連接服務器
生成 SSH 密鑰
密鑰是免登錄連接服務器的通行證,有種刷臉通行的感覺。如果本地已經存在並且不想另外生成的話,可以跳過此步。
cd ~/.ssh 切換目錄后用 ssh-keygen -t rsa -C "用於區分密鑰的標識" 生成一對具有相同名字的密鑰(默認為 id_rsa 和id_rsa.pub):用於本地的私鑰和用於服務器的公鑰(有 .pub 擴展名)。
如果私鑰名字不是默認的話,需要手動加入到被「認證」的私鑰列表中,否則每次連接服務器都會提示輸入服務器的密碼。在遇到了一些坑(文后有說明)后,我覺得設置 SSH config 最為靠譜!
編輯 ~/.ssh/config 文件(如果不存在則 touch ~/.ssh/config 創建一下),添加以下內容:
Host HOST_ALIAS # 用於 SSH 連接的別名,最好與 HostName 保持一致
HostName SERVER_DOMAIN # 服務器的域名或 IP 地址
Port SERVER_PORT # 服務器的端口號,默認為 22,可選
User SERVER_USER # 服務器的用戶名
PreferredAuthentications publickey
IdentityFile ~/.ssh/PRIVATE_KEY # 本機上存放的私鑰路徑
如下所示
Host BRIDGE_REPO
HostName xxx.xxx.xxx.xxx
Port 22
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
服務器端認證
#先用 pbcopy < ~/.ssh/PRIVATE_KEY.pub 將公鑰復制到剪貼板;通過 ssh USER@SERVER 訪問服務器,這時會提示輸入密碼(它也許只有這么一次「詢問」的機會);成功登錄后 vim ~/.ssh/authorized_keys,在合適的位置 cmd + V 並保存退出(同時 exit退出 SSH 連接)。
進入服務器直接 vi /root/.ssh/authorized_keys
將公鑰內容復制進去
配置 Git 倉庫
創建服務器端倉庫
服務器上需要配置兩個倉庫,一個用於代碼中轉的遠程倉庫,一個用於用戶訪問的本地倉庫。這里的「遠程倉庫」並不等同於托管代碼的「中央倉庫」,這兩個倉庫都是為了自動同步代碼並部署網站而存在。
在存放遠程倉庫的目錄中(假設是 /home/USER/repos)執行 git init --bare BRIDGE_REPO.git 會創建一個包含 Git 各種配置文件的「裸倉庫」。
切換到存放用戶所訪問文件的目錄(假設為 /home/USER/www,如果不存在則在 /home/USER 中執行 mkdir www):
git init
git remote add origin /home/USER/repos/BRIDGE_REPO.git
git fetch
git checkout master
配置 Git Hook
將目錄切換至 /home/USER/repos/BRIDGE_REPO.git/hooks,用 cp post-receive.sample post-receive 復制並重命名文件后用 vim post-receive 修改。其內容大致如下:
下面的shell腳本自己摸索,可以並不相同
#!/bin/sh
unset GIT_DIR #這一句是非常重要的
NowPath=`pwd`
DeployPath="../../www"
cd $DeployPath
git pull origin master
cd $NowPath
exit 0
使用 chmod +x post-receive 改變一下權限后,服務器端的配置就基本完成了。
更新本機的倉庫源
在原有的(托管代碼的)倉庫上加入剛才所配置的服務器上的遠程倉庫的地址為源,以后往那個源推送代碼后就會自動部署了。
總結
在搭建環境時並沒有一帆風順,磕磕絆絆遇到不少問題,雖然很多不值得一提,但有的點還是有記錄並分享的價值的!
SSH 私鑰「認證」
將生成的私鑰進行「認證」有不止一種方式,然而,起初我用的是最挫最不靠譜的 ssh-add ~/.ssh/PRIVATE_KEY——只是在當前 session 有效,一重啟就又會被「詢問」了!
錯誤處理
remote: error: cannot open .git/FETCH_HEAD: Permission denied
將整個項目文件夾配置用戶和用戶組
chown -R git:git BRIDGE_REPO
Part6:git 刪除本地分支和遠程分支、本地代碼回滾和遠程代碼庫回滾
【git 刪除本地分支】
git branch -D br
【git 刪除遠程分支】
git push origin :br (origin 后面有空格)
git代碼庫回滾: 指的是將代碼庫某分支退回到以前的某個commit id
【本地代碼庫回滾】:
git reset --hard commit-id :回滾到commit-id,講commit-id之后提交的commit都去除
git reset --hard HEAD~3:將最近3次的提交回滾
【遠程代碼庫回滾】:
這個是重點要說的內容,過程比本地回滾要復雜
應用場景:自動部署系統發布后發現問題,需要回滾到某一個commit,再重新發布
原理:先將本地分支退回到某個commit,刪除遠程分支,再重新push本地分支
操作步驟:
1、git checkout the_branch
2、git pull
3、git branch the_branch_backup //備份一下這個分支當前的情況
4、git reset --hard the_commit_id //把the_branch本地回滾到the_commit_id
5、git push origin :the_branch //刪除遠程 the_branch
6、git push origin the_branch //用回滾后的本地分支重新建立遠程分支
7、git push origin :the_branch_backup //如果前面都成功了,刪除這個備份分支
如果使用了gerrit做遠程代碼中心庫和code review平台,需要確保操作git的用戶具備分支的push權限,並且選擇了 Force Push選項(在push權限設置里有這個選項)
另外,gerrit中心庫是個bare庫,將HEAD默認指向了master,因此master分支是不能進行刪除操作的,最好不要選擇刪除master分支的策略,換用其他分支。如果一定要這樣做,可以考慮到gerrit服務器上修改HEAD指針。。。不建議這樣搞
有時候並行的開發了很多的特性,建了很多的分支,時間長了分支就多了,想要把不用的分支刪除,怎么辦呢?
#查看本地都有哪些分支
git branch
#查看所有的分支,包括遠程的
git branch -a
#刪除本地的某個分支
git branch -D hongchangfirst
#刪除遠程的分支
git branch -r -d origin/hongchangfirst
#注意這個只是刪除本地的索引,而不是真正刪除遠程分支的內容,要想真正刪除遠程分支上的內容,可以這樣:
git push origin :hongchangfirst
注意,冒號前面的空格不能少,相當於把一個空分支push到server上,等於刪除該分支。
做為一名程序員,除了寫寫代碼外,還負責公司的GIT庫的日常維護工作。GIT日常操作不是很多,掌握這些技能就夠了,在這里主要是分享一下GIT分支的刪除操作,希望可以幫到剛學習GIT的同學。這里的刪除操作主要是服務器本地操作和遠端刪除操作。
GIT
方法/步驟
前提條件,必須下載安裝了GIT客戶端軟件,以下操作僅限於Windows操作。
右鍵點擊GIT庫,選擇Git Bash選項。
GIT如何刪除分支
這時會彈出如下窗口,默認就進入當前GIT庫。
GIT如何刪除分支
如下圖所示,先看一下當前庫中有哪些分支:
git branch -a
GIT如何刪除分支
要刪除服務器遠端的分支,則執行如下所示的命令:
git push origin –delete 分支名
GIT如何刪除分支
如果是要刪除本地已經合並了的分支,則執行:
git branch –d 分支名
GIT如何刪除分支
下圖中的命令是為了刪除本地未合並的分支:
git branch –D 分支名
Part7:git命令之git remote的用法
要 參與任何一個 Git 項目的協作,必須要了解該如何管理遠程倉庫.遠程倉庫是指托管在網絡上的項目倉庫,可能會有好多個,其中有些你只能讀,另外有些可以寫.同他人協作開發某 個項目時,需要管理這些遠程倉庫,以便推送或拉取數據,分享各自的工作進展.管理遠程倉庫的工作,包括添加遠程庫,移除廢棄的遠程庫,管理各式遠程庫分 支,定義是否跟蹤這些分支,等等.本節我們將詳細討論遠程庫的管理和使用.
查看當前的遠程庫
要查看當前配置有哪些遠程倉庫,可以用 git remote 命令,它會列出每個遠程庫的簡短名字.在克隆完某個項目后,至少可以看到一個名為 origin 的遠程庫,Git 默認使用這個名字來標識你所克隆的原始倉庫:
$ git clone git://github.com/schacon/ticgit.git
Initialized empty Git repository in /private/tmp/ticgit/.git/
remote: Counting objects: 595, done.
remote: Compressing objects: 100% (269/269), done.
remote: Total 595 (delta 255), reused 589 (delta 253)
Receiving objects: 100% (595/595), 73.31 KiB | 1 KiB/s, done.
Resolving deltas: 100% (255/255), done.
$ cd ticgit
(1)git remote 不帶參數,列出已經存在的遠程分支
$ git remote
origin
(2)git remote -v | --verbose 列出詳細信息,在每一個名字后面列出其遠程url
此時, -v 選項(譯注:此為 –verbose 的簡寫,取首字母),顯示對應的克隆地址:
$ git remote -v
origin git://github.com/schacon/ticgit.git如果有多個遠程倉庫,此命令將全部列出.比如在我的 Grit 項目中,可以看到:
$ cd grit
$ git remote -v
bakkdoor git://github.com/bakkdoor/grit.git
cho45 git://github.com/cho45/grit.git
defunkt git://github.com/defunkt/grit.git
koke git://github.com/koke/grit.git
origin 這樣一來,我就可以非常輕松地從這些用戶的倉庫中,拉取他們的提交到本地.請注意,上面列出的地址只有 origin 用的是 SSH URL 鏈接,所以也只有這個倉庫我能推送數據上去(我們會在第四章解釋原因).
添加遠程倉庫
要添加一個新的遠程倉庫,可以指定一個簡單的名字,以便將來引用,運行 git remote add [shortname] [url]:
$ git remote
origin
$ git remote add pb git://github.com/paulboone/ticgit.git
$ git remote -v
origin git://github.com/schacon/ticgit.git
pb git://github.com/paulboone/ticgit.git現在可以用字串 pb 指代對應的倉庫地址了.比如說,要抓取所有 Paul 有的,但本地倉庫沒有的信息,可以運行 git fetch pb:
$ git fetch pb
remote: Counting objects: 58, done.
remote: Compressing objects: 100% (41/41), done.
remote: Total 44 (delta 24), reused 1 (delta 0)
Unpacking objects: 100% (44/44), done.
From git://github.com/paulboone/ticgit
* [new branch] master -> pb/master
* [new branch] ticgit -> pb/ticgit
現在,Paul 的主干分支(master)已經完全可以在本地訪問了,對應的名字是 pb/master,你可以將它合並到自己的某個分支,或者切換到這個分支,看看有些什么有趣的更
二.通過git remote 建立遠程倉庫
建立遠程倉庫
最近一直在學習使用git來管理自己的程序,總是今天東學一點,明天西湊一點,到用的時候,總是有些茫然不知所措。
在博客園里看見一篇老好的文章,教我們做筆記啦,但是做完筆記還是要記得總結哦!
來吧,讓我們一起來總結吧,今天先來看看git遠程的倉庫是怎么建立的。
當然,使用git嘛,第一步肯定是得新建一個git倉庫,總得有個操作的空間吧,巧婦難為無米之炊嘛。
1.初始化一個空的git倉庫
1 software@debian:~$ mkdir yafeng
2 software@debian:~$ cd yafeng/
3 software@debian:~/yafeng$ ls
4 software@debian:~/yafeng$ git init
5 Initialized empty Git repository in /home/software/yafeng/.git/
6 software@debian:~/yafeng$
命令注釋:
在上面的命令中,真正去初始化的是第四行的那句---git init
當然,還有很多同學會看見加了參數--bare的命令,這個命令會在我們以后慢慢給大家解釋,對於不是作為共享倉庫,而是作為一個自己操作的倉庫,上面這樣就足夠了。
好了,現在yafeng目錄就是我們的據點---git倉庫了哦。
下面我們總要做點什么的吧,入寶山總不能光看着哦:
2.向倉庫提交我們寫的文件
1 software@debian:~/yafeng$ echo "our first git repository" >> file
2 software@debian:~/yafeng$ ls
3 file
4 software@debian:~/yafeng$ git add file
5 software@debian:~/yafeng$ git commit -m "the first file to commit" file
6 [master (root-commit) 0c72641] the first file to commit
7 1 files changed, 1 insertions(+), 0 deletions(-)
8 create mode 100644 file
9 software@debian:~/yafeng$
命令解釋:
我們在倉庫中新建了一個文件file,作為我們的示例文件。
第4行:將file文件的信息添加到git倉庫的索引庫中,並沒有真正添加到庫。當然上例中的file文件只是我們的示例,它是一個路徑,因此,可以是文件,更可以是目錄。
第5行:將索引庫中的內容向git倉庫進行提交。這步之后文件file才算真正提交到拉git倉庫中。雙引號中的內容是根據每次修改的不同內容,由我們自己去填寫的,
很多人會看見
git commit -a -m “ ”
這條的命令是在你已經add了一個或多個文件過之后,然后修改了這些文件,就可以使用該命令進行提交。
好了,不管怎么樣,終於是將文件提交到庫了。可是現在的倉庫只是一個本地的倉庫,我們的目標是變成遠程倉庫哦,繼續吧。
3.在本地倉庫添加一個遠程倉庫,並將本地的master分支跟蹤到遠程分支
1 software@debian:~/yafeng$ git remote add origin ssh://software@172.16.0.30/~/yafeng/.git
2 software@debian:~/yafeng$ git push origin master
3 software@172.16.0.30's password:
4 Everything up-to-date
5 software@debian:~/yafeng$
命令注釋:
第1行:在本地倉庫添加一個遠程倉庫,當然ssh后面的地址是我們本地倉庫的地址.
第2行:將本地master分支跟蹤到遠程分支,在git倉庫建立之初就會有一個默認的master分支,當然你如果建立了其他分支,也可以用同樣的方法去跟蹤.
對於分支的事情,我們會在以后細細的講述.
做到拉這一步了嗎?我告訴你,你已經完成目的了哦,現在的git倉庫已經是一個遠程倉庫了,
不相信嗎?我們來測試一次阿:
4.測試
現在本機上看看:
1 software@debian:~/yafeng$ git remote show origin
2 software@172.16.0.30's password:
3 * remote origin
4 Fetch URL: ssh://software@172.16.0.30/~/yafeng/.git
5 Push URL: ssh://software@172.16.0.30/~/yafeng/.git
6 HEAD branch: master
7 Remote branch:
8 master tracked
9 Local ref configured for 'git push':
10 master pushes to master (up to date)
11 software@debian:~/yafeng$
代碼注釋:
第1行:顯示遠程信息
很多看見這還是會不以為然的,這又能說明什么呢?好,那就來點實際的:
在另一個機子上,遠程clone
1 root@yafeng-VirtualBox:~# ls
2 bin gittest read_temp
3 root@yafeng-VirtualBox:~# git clone ssh://software@172.16.0.30/~/yafeng/.git
4 Cloning into yafeng...
5 software@172.16.0.30's password:
6 remote: Counting objects: 9, done.
7 remote: Compressing objects: 100% (3/3), done.
8 remote: Total 9 (delta 0), reused 0 (delta 0)
9 Receiving objects: 100% (9/9), done.
10 root@yafeng-VirtualBox:~# ls
11 bin gittest read_temp yafeng
12 root@yafeng-VirtualBox:~# cd yafeng/
13 root@yafeng-VirtualBox:~/yafeng# ls
14 file
15 root@yafeng-VirtualBox:~/yafeng#
代碼注釋:
第3行:就是遠程clone倉庫.很明顯的對比可以知道多了yafeng目錄,而這個yafeng目錄里的內容和我們另外一台機子上的內容一樣
至此,一個簡單的git遠程倉庫就建好了,簡單不,試試吧!!
part8:SSH下know_hosts的作用
ssh會把你每個你訪問過計算機的公鑰(public key)都記錄在~/.ssh/known_hosts。當下次訪問相同計算機時,OpenSSH會核對公鑰。如果公鑰不同,OpenSSH會發出警告, 避免你受到DNS Hijack之類的攻擊。我在上面列出的情況,就是這種情況。
原因:一台主機上有多個Linux系統,會經常切換,那么這些系統使用同一ip,登錄過一次后就會把ssh信息記錄在本地的~/.ssh/known_hsots文件中,切換該系統后再用ssh訪問這台主機就會出現沖突警告,需要手動刪除修改known_hsots里面的內容。
有以下兩個解決方案:
1. 手動刪除修改known_hsots里面的內容;
2. 修改配置文件“~/.ssh/config”,加上這兩行,重啟服務器。
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
優缺點:
1. 需要每次手動刪除文件內容,一些自動化腳本的無法運行(在SSH登陸時失敗),但是安全性高;
2. SSH登陸時會忽略known_hsots的訪問,但是安全性低;
Part9:git diff命令詳解
git diff命令詳解
diff里面a表示前面那個變量,b表示第二個變量
HEAD commit版本
Index staged版本
a、查看尚未暫存的文件更新了哪些部分,不加參數直接輸入
git diff
此命令比較的是工作目錄(Working tree)和暫存區域快照(index)之間的差異
也就是修改之后還沒有暫存起來的變化內容。
b、查看已經暫存起來的文件(staged)和上次提交時的快照之間(HEAD)的差異
git diff --cached
git diff --staged
顯示的是下一次commit時會提交到HEAD的內容(不帶-a情況下)
c、顯示工作版本(Working tree)和HEAD的差別
git diff HEAD
d、直接將兩個分支上最新的提交做diff
git diff topic master 或 git diff topic..master
e、輸出自topic和master分別開發以來,master分支上的changed。
git diff topic...master
Changes that occurred on the master branch since when the topic
branch was started off it
f、查看簡單的diff結果,可以加上--stat參數
git diff --stat
g、查看當前目錄和另外一個分支的差別
git diff test
顯示當前目錄和另一個叫'test'分支的差別
git diff HEAD -- ./lib
顯示當前目錄下的lib目錄和上次提交之間的差別(更准確的說是在當前分支下)
h、比較上次提交commit和上上次提交
git diff HEAD^ HEAD
i、比較兩個歷史版本之間的差異
git diff SHA1 SHA2
Part10:git push出現的錯誤
$ git push
Enter passphrase for key '/f/wamp64/www/.ssh/id_rsa':
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 827 bytes | 206.00 KiB/s, done.
Total 6 (delta 4), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database ./objects
remote: fatal: failed to write object
error: remote unpack failed: unpack-objects abnormal exit
To ssh://xxx.xxx.xxx.xxx/data/gitshare/erp.git
! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'ssh://git@xxx.xxx.xxx.xxx/data/gitxxx/xxx.git'
解決:
chown -R git:git xxx.git
Part11:git查詢某次修改的內容
Git 查詢某次歷史提交的修改內容
在工作時,有時候想查看某次的提交修改了哪些的內容。
我們首先可以git log顯示歷史的提交列表:
之后我們用git show <commit-hashId> 便可以顯示某次提交的修改內容
同樣 git show <commit-hashId> filename 可以顯示某次提交的某個內容的修改信息。
Part12:Git 本地的撤銷修改和刪除操作
一:撤銷操作
比如我現在在readme.txt文件里面增加一行 內容為555555555555,我們先通過命令查看如下:
在我未提交之前,我發現添加5555555555555內容有誤,所以我得馬上恢復以前的版本,現在我可以有如下幾種方法可以做修改:
第一:如果我知道要刪掉那些內容的話,直接手動更改去掉那些需要的文件,然后add添加到暫存區,最后commit掉。
第二:我可以按以前的方法直接恢復到上一個版本。使用 git reset –hard HEAD^
但是現在我不想使用上面的2種方法,我想直接想使用撤銷命令該如何操作呢?首先在做撤銷之前,我們可以先用 git status 查看下當前的狀態。如下所示:
可以發現,Git會告訴你,git checkout — file 可以丟棄工作區的修改,如下命令:
git checkout – readme.txt,如下所示:
命令 git checkout –readme.txt 意思就是,把readme.txt文件在工作區做的修改全部撤銷,這里有2種情況,如下:
- readme.txt自動修改后,還沒有放到暫存區,使用 撤銷修改就回到和版本庫一模一樣的狀態。
- 另外一種是readme.txt已經放入暫存區了,接着又作了修改,撤銷修改就回到添加暫存區后的狀態。
其實也就是撤銷到最后一次沒有放入暫存區的狀態。
對於第二種情況,我想我們繼續做demo來看下,假如現在我對readme.txt添加一行 內容為6666666666666,我git add 增加到暫存區后,接着添加內容7777777,我想通過撤銷命令讓其回到暫存區后的狀態。如下所示:
注意:命令git checkout — readme.txt 中的 — 很重要,如果沒有 — 的話,那么命令變成創建分支了。
二:刪除文件。
假如我現在版本庫testgit目錄添加一個文件b.txt,然后提交。如下:
如上:一般情況下,可以直接在文件目錄中把文件刪了,或者使用如上rm命令:rm b.txt ,如果我想徹底從版本庫中刪掉了此文件的話,可以再執行commit命令 提交掉,現在目錄是這樣的
只要沒有commit之前,如果我想在版本庫中恢復此文件如何操作呢?
可以使用如下命令 git checkout — b.txt,如下所示:
再來看看我們testgit目錄,添加了3個文件了。如下所示:
Part13:git命令之git clone用法
git命令之git clone用法
轉:http://blog.csdn.net/wangjia55/article/details/8818845
在使用git來進行版本控制時,為了得一個項目的拷貝(copy),我們需要知道這個項目倉庫的地址(Git URL). Git能在許多協議下使用,所以Git URL可能以ssh://, http(s)://, git://,或是只是以一個用戶名(git 會認為這是一個ssh 地址)為前輟.
有些倉庫可以通過不只一種協議來訪問,例如,Git本身的源代碼你既可以用 git:// 協議來訪問:
git clone git://git.kernel.org/pub/scm/git/git.git
也可以通過http 協議來訪問:
git clone http://www.kernel.org/pub/scm/git/git.git
git://協議較為快速和有效,但是有時必須使用http協議,比如你公司的防火牆阻止了你的非http訪問請求.如果你執行了上面兩行命令中的任意一個,你會看到一個新目錄: 'git',它包含有所的Git源代碼和歷史記錄.
在默認情況下,Git會把"Git URL"里最后一級目錄名的'.git'的后輟去掉,做為新克隆(clone)項目的目錄名: (例如. git clone http://git.kernel.org/linux/kernel/git/torvalds/linux-2.6.git 會建立一個目錄叫'linux-2.6')
另外,如果訪問一個Git URL需要用法名和密碼,可以在Git URL前加上用戶名,並在它們之間加上@符合以表示分割,然后執行git clone命令,git會提示你輸入密碼。
示例
git clone robin.hu@http://www.kernel.org/pub/scm/git/git.git
這樣將以作為robin.hu用戶名訪問http://www.kernel.org/pub/scm/git/git.git,然后按回車鍵執行git clone命令,git會提示你輸入密碼。
另外,我們可以通過-b <name>來指定要克隆的分支名,比如
$ git clone -b master2 ../server .
表示克隆名為master2的這個分支,如果省略-b <name>表示克隆master分支。
GIT URLS
In general, URLs contain information about the transport protocol, the address of the remote server, and the path to the repository. Depending on the transport protocol, some of this information may be absent.
Git natively supports ssh, git, http, https, ftp, ftps, and rsync protocols. The following syntaxes may be used with them:
ssh://[user@]host.xz[:port]/path/to/repo.git/
git://host.xz[:port]/path/to/repo.git/
http[s]://host.xz[:port]/path/to/repo.git/
ftp[s]://host.xz[:port]/path/to/repo.git/
rsync://host.xz/path/to/repo.git/
An alternative scp-like syntax may also be used with the ssh protocol:
[user@]host.xz:path/to/repo.git/
The ssh and git protocols additionally support ~username expansion:
ssh://[user@]host.xz[:port]/~[user]/path/to/repo.git/
git://host.xz[:port]/~[user]/path/to/repo.git/
[user@]host.xz:/~[user]/path/to/repo.git/
For local repositories, also supported by git natively, the following syntaxes may be used:
/path/to/repo.git/
file:///path/to/repo.git/
Examples
Clone from upstream:
$ git clone git://git.kernel.org/pub/scm/.../linux-2.6 my2.6 $ cd my2.6 $ make
Make a local clone that borrows from the current directory, without checking things out:
$ git clone -l -s -n . ../copy $ cd ../copy $ git show-branch
Clone from upstream while borrowing from an existing local directory:
$ git clone --reference my2.6 \ git://git.kernel.org/pub/scm/.../linux-2.7 \ my2.7 $ cd my2.7
Create a bare repository to publish your changes to the public:
$ git clone --bare -l /home/proj/.git /pub/scm/proj.git
Create a repository on the kernel.org machine that borrows from Linus:
$ git clone --bare -l -s /pub/scm/.../torvalds/linux-2.6.git \ /pub/scm/.../me/subsys-2.6.git
Part14:Git遠程操作詳解
Git遠程操作詳解
Git是目前最流行的版本管理系統,學會Git幾乎成了開發者的必備技能。
Git有很多優勢,其中之一就是遠程操作非常簡便。本文詳細介紹5個Git命令,它們的概念和用法,理解了這些內容,你就會完全掌握Git遠程操作。
- § git clone
- § git remote
- § git fetch
- § git pull
- § git push
本文針對初級用戶,從最簡單的講起,但是需要讀者對Git的基本用法有所了解。同時,本文覆蓋了上面5個命令的幾乎所有的常用用法,所以對於熟練用戶也有參考價值。
一、git clone
遠程操作的第一步,通常是從遠程主機克隆一個版本庫,這時就要用到git clone命令。
$ git clone <版本庫的網址>
比如,克隆jQuery的版本庫。
$ git clone https://github.com/jquery/jquery.git
該命令會在本地主機生成一個目錄,與遠程主機的版本庫同名。如果要指定不同的目錄名,可以將目錄名作為git clone命令的第二個參數。
$ git clone <版本庫的網址> <本地目錄名>
git clone支持多種協議,除了HTTP(s)以外,還支持SSH、Git、本地文件協議等,下面是一些例子。
$ git clone http[s]://example.com/path/to/repo.git/
$ git clone ssh://example.com/path/to/repo.git/
$ git clone git://example.com/path/to/repo.git/
$ git clone /opt/git/project.git
$ git clone file:///opt/git/project.git
$ git clone ftp[s]://example.com/path/to/repo.git/
$ git clone rsync://example.com/path/to/repo.git/
SSH協議還有另一種寫法。
$ git clone [user@]example.com:path/to/repo.git/
通常來說,Git協議下載速度最快,SSH協議用於需要用戶認證的場合。各種協議優劣的詳細討論請參考官方文檔。
二、git remote
為了便於管理,Git要求每個遠程主機都必須指定一個主機名。git remote命令就用於管理主機名。
不帶選項的時候,git remote命令列出所有遠程主機。
$ git remote
origin
使用-v選項,可以參看遠程主機的網址。
$ git remote -v
origin git@github.com:jquery/jquery.git (fetch)
origin git@github.com:jquery/jquery.git (push)
上面命令表示,當前只有一台遠程主機,叫做origin,以及它的網址。
克隆版本庫的時候,所使用的遠程主機自動被Git命名為origin。如果想用其他的主機名,需要用git clone命令的-o選項指定。
$ git clone -o jQuery https://github.com/jquery/jquery.git
$ git remote
jQuery
上面命令表示,克隆的時候,指定遠程主機叫做jQuery。
git remote show命令加上主機名,可以查看該主機的詳細信息。
$ git remote show <主機名>
git remote add命令用於添加遠程主機。
$ git remote add <主機名> <網址>
git remote rm命令用於刪除遠程主機。
$ git remote rm <主機名>
git remote rename命令用於遠程主機的改名。
$ git remote rename <原主機名> <新主機名>
三、git fetch
一旦遠程主機的版本庫有了更新(Git術語叫做commit),需要將這些更新取回本地,這時就要用到git fetch命令。
$ git fetch <遠程主機名>
上面命令將某個遠程主機的更新,全部取回本地。
git fetch命令通常用來查看其他人的進程,因為它取回的代碼對你本地的開發代碼沒有影響。
默認情況下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。
$ git fetch <遠程主機名> <分支名>
比如,取回origin主機的master分支。
$ git fetch origin master
所取回的更新,在本地主機上要用"遠程主機名/分支名"的形式讀取。比如origin主機的master,就要用origin/master讀取。
git branch命令的-r選項,可以用來查看遠程分支,-a選項查看所有分支。
$ git branch -r
origin/master
$ git branch -a
* master
remotes/origin/master
上面命令表示,本地主機的當前分支是master,遠程分支是origin/master。
取回遠程主機的更新以后,可以在它的基礎上,使用git checkout命令創建一個新的分支。
$ git checkout -b newBrach origin/master
上面命令表示,在origin/master的基礎上,創建一個新分支。
此外,也可以使用git merge命令或者git rebase命令,在本地分支上合並遠程分支。
$ git merge origin/master
# 或者
$ git rebase origin/master
上面命令表示在當前分支上,合並origin/master。
四、git pull
git pull命令的作用是,取回遠程主機某個分支的更新,再與本地的指定分支合並。它的完整格式稍稍有點復雜。
$ git pull <遠程主機名> <遠程分支名>:<本地分支名>
比如,取回origin主機的next分支,與本地的master分支合並,需要寫成下面這樣。
$ git pull origin next:master
如果遠程分支是與當前分支合並,則冒號后面的部分可以省略。
$ git pull origin next
上面命令表示,取回origin/next分支,再與當前分支合並。實質上,這等同於先做git fetch,再做git merge。
$ git fetch origin
$ git merge origin/next
在某些場合,Git會自動在本地分支與遠程分支之間,建立一種追蹤關系(tracking)。比如,在git clone的時候,所有本地分支默認與遠程主機的同名分支,建立追蹤關系,也就是說,本地的master分支自動"追蹤"origin/master分支。
Git也允許手動建立追蹤關系。
git branch --set-upstream master origin/next
上面命令指定master分支追蹤origin/next分支。
如果當前分支與遠程分支存在追蹤關系,git pull就可以省略遠程分支名。
$ git pull origin
上面命令表示,本地的當前分支自動與對應的origin主機"追蹤分支"(remote-tracking branch)進行合並。
如果當前分支只有一個追蹤分支,連遠程主機名都可以省略。
$ git pull
上面命令表示,當前分支自動與唯一一個追蹤分支進行合並。
如果合並需要采用rebase模式,可以使用--rebase選項。
$ git pull --rebase <遠程主機名> <遠程分支名>:<本地分支名>
如果遠程主機刪除了某個分支,默認情況下,git pull 不會在拉取遠程分支的時候,刪除對應的本地分支。這是為了防止,由於其他人操作了遠程主機,導致git pull不知不覺刪除了本地分支。
但是,你可以改變這個行為,加上參數 -p 就會在本地刪除遠程已經刪除的分支。
$ git pull -p
# 等同於下面的命令
$ git fetch --prune origin
$ git fetch -p
五、git push
git push命令用於將本地分支的更新,推送到遠程主機。它的格式與git pull命令相仿。
$ git push <遠程主機名> <本地分支名>:<遠程分支名>
注意,分支推送順序的寫法是<來源地>:<目的地>,所以git pull是<遠程分支>:<本地分支>,而git push是<本地分支>:<遠程分支>。
如果省略遠程分支名,則表示將本地分支推送與之存在"追蹤關系"的遠程分支(通常兩者同名),如果該遠程分支不存在,則會被新建。
$ git push origin master
上面命令表示,將本地的master分支推送到origin主機的master分支。如果后者不存在,則會被新建。
如果省略本地分支名,則表示刪除指定的遠程分支,因為這等同於推送一個空的本地分支到遠程分支。
$ git push origin :master
# 等同於
$ git push origin --delete master
上面命令表示刪除origin主機的master分支。
如果當前分支與遠程分支之間存在追蹤關系,則本地分支和遠程分支都可以省略。
$ git push origin
上面命令表示,將當前分支推送到origin主機的對應分支。
如果當前分支只有一個追蹤分支,那么主機名都可以省略。
$ git push
如果當前分支與多個主機存在追蹤關系,則可以使用-u選項指定一個默認主機,這樣后面就可以不加任何參數使用git push。
$ git push -u origin master
上面命令將本地的master分支推送到origin主機,同時指定origin為默認主機,后面就可以不加任何參數使用git push了。
不帶任何參數的git push,默認只推送當前分支,這叫做simple方式。此外,還有一種matching方式,會推送所有有對應的遠程分支的本地分支。Git 2.0版本之前,默認采用matching方法,現在改為默認采用simple方式。如果要修改這個設置,可以采用git config命令。
$ git config --global push.default matching
# 或者
$ git config --global push.default simple
還有一種情況,就是不管是否存在對應的遠程分支,將本地的所有分支都推送到遠程主機,這時需要使用--all選項。
$ git push --all origin
上面命令表示,將所有本地分支都推送到origin主機。
如果遠程主機的版本比本地版本更新,推送時Git會報錯,要求先在本地做git pull合並差異,然后再推送到遠程主機。這時,如果你一定要推送,可以使用--force選項。
$ git push --force origin
上面命令使用--force選項,結果導致遠程主機上更新的版本被覆蓋。除非你很確定要這樣做,否則應該盡量避免使用--force選項。
最后,git push不會推送標簽(tag),除非使用--tags選項。
$ git push origin --tags
(完)
