終端上設置git

http://blog.163.com/xianfuying@126/blog/static/21960005201181482518631/git

在~/.ssh的位置vi id_rsa.pubgithub

拷貝的時候id_rsa.pub裏面從服務器

sh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQE....................................

到email地址結束。ssh

第一次生成的key竟然Access denied了。。ide

從新搞了一個成功。fetch

而後ui

git remote add origin git@github.com:用戶名/項目名稱.gitspa

git pull origin master 就PULL一個之前folk的項目下來了。unix

下次在本身的服務器上試試。code

Guides: Tell git your user name and email address  
Git needs to know your username and email address to properly tag your commits. This is normally done on a global level: 

[~]$ git config --global user.name "lubin" 
[~]$ git config --global user.email lubin.z@gmail.com 
You can override these settings on a per-repo basis: 

[~/path/to/repo]$ git config user.name "lubin" 
[~/path/to/repo]$ git config user.email lubin.z@gmail.com 
This change will only affect future commits. Past commits will retain the username and address they were committed with. 

Some tools will assume your github config is in the same place (http://github.com/blog/180-local-github-config):

[~]$ git config --global github.user lubin 
[~]$ git config --global github.token 6ef8395fecf207165f1a82178ae1b984 

 搞砸了,怎麼恢復?

刪光本地文件,這時候pull會說 already-up-to-date

那麼checkout 上一版的hash id:

git checkout AAAAB3NzaC1yc2EAAAABIwAAAQE..

這樣本地版本就低於遠程的,再pull就能夠恢復回去了!

有了搞砸以前的文件,能夠重頭來過。

可是改好後,能夠commit,並不能push成功。

立刻push會出現:

HEAD detached at 0d731b8
nothing to commit, working directory clean

因爲脫離了head,指向的是一次commit的id

必須:

git checkout master
會提示: Switched to branch
'master' Your branch is up-to-date with 'origin/master'.

這樣作以前備份好以前修改好的代碼,或者,根本就只是在脫離頭部的時候將上一版拷出去改的也能夠。

回到head,放入最新的文件,commit,push成功。

若是一開始就沒有備份,那麼只好git clone 後接git remote -v查詢到的git庫地址便可。

有一點要注意的是,clone下來若是git項目文件夾被覆蓋一次,須要終端cd .. 而後從新進入該目錄,不然會:

fatal: Unable to read current working directory: No such file or directory

切勿驚慌。。。

若是隻是working tree被改壞了,文件沒有什麼改動,能夠reset --keep

git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD] 

重設working tree中發生變化的文件。

index,執行git add的操做,會對文件建立索引,全部被跟蹤的文件索引會放入index,表示文件被修改待提交
       working tree,當前工做區,被修改但未被add的文件,存儲在工做區 
       ORIG_HEAD,用於指向前一個操做狀態,每次的commit或者pull或者reset,git 都會把老的HEAD拷貝到.git/ORIG_HEAD,經過對ORIG_HEAD的引用可    以指向前一次的操做狀態 

1、hard(慎用) 
重設index和working tree,全部改變都會被丟棄,包括文件的修改、新增、刪除等操做,並把HEAD指向<commit>, 
所以經過git log查看版本提交記錄,被reset的版本記錄會被丟棄,但能夠經過git reflog查看 

2、soft 
不重設index和working tree,僅僅將HEAD指向<commit>,表示已經commit的文件會取消commit, 
經過git status查看,文件會處於待commit狀態「Changes to be committed」 

3、mixed(默認) 
重設index,但不重設working tree,表示已經被add的文件,被取消add, 
經過git status查看,文件會處於待添加索引狀態 「Changes not staged for commit」 

4、merge 
重設index,重設working tree中發生變化的文件,可是保留index和working tree不一致的文件 

5、keep 
重設index,重設working tree中發生變化的文件
reset

曾經有前輩誤刪了commit以後用cherry-pick找回來

1 git reflog  
2 502dd0f HEAD@{0}: HEAD~1: updating HEAD  
3 147b3b5 HEAD@{1}: commit: test3  
4 502dd0f HEAD@{2}: commit: test2  
5 0692c03 HEAD@{3}: commit (initial): test1  
6   
7 git reset --hard 502dd0f  
8 git cherry-pick 147b3b5  

若是明知本身的代碼沒做什麼修改,不是最新的,能夠Fetch對方的代碼,

但這並不會覆蓋本身的舊文件,就算沒有衝突,也仍是須要merge,不然就只加入新文件。

git reset --hard HEAD
git clean -f -d
git fetch origin master

上面的reset能夠清除一些已經刪掉了的文件無心義的存在於index又沒法rm的狀況。

1. git fetch:至關因而從遠程獲取最新版本到本地,不會自動merge
    
git fetch origin master
git log -p master..origin/master
git merge origin/master
    以上命令的含義:
   首先從遠程的origin的master主分支下載最新的版本到origin/master分支上
   而後比較本地的master分支和origin/master分支的差異
   最後進行合併

   上述過程其實能夠用如下更清晰的方式來進行:

git fetch origin master:tmp
git diff tmp 
git merge tmp
    從遠程獲取最新的版本到本地的test分支上
   以後再進行比較合併

2. git pull:至關因而從遠程獲取最新版本並merge到本地
git pull origin master
fetch和pull

git log --pretty online 更好看的log列表方式

git log --graph 用圖表形式顯示log

在HEAD後面跟^一個表明前一個版本,跟2兩個表示前2個版本,~2也表示前2個版本。

git cat-file -p 分頁顯示文件內容

tree .git 用unix命令顯示文件夾結構

touch 用unix命令新增一個文件,好比 touch hello.txt

mv 用unix命令移動文件,好比 mv aaa ../

-t 在unix命令中表示type

reset負責的是從responsitories到index的部分,會幹掉index中有記錄的文件。

checkout負責的是從index到working tree的部分,可與reset連用造成一次完整修改。

git reflog 查看丟失的commit id ,對於reset幹掉的記錄也能夠顯示,而後reset到那個id便可恢復index。

 

前面講到的git reset只是在本地倉庫中回退版本,而遠程倉庫的版本不會變化,這樣,即時本地reset了,但若是再git pull,那麼,遠程倉庫的內容又會和本地以前版本的內容進行merge,這並非咱們想要的東西,這時能夠用 如下 方法來解決這個問題

 




注意是分支,不是commit id#刪除遠程的xxx分支git push origin :xxx

對於一些只pull不push的庫,能夠每次pull以前用git checkout -f 來否認本身的修改 與git reset --hard HEAD 差很少。

經常的會發現比起remote add, 直接clone會得到更完整的工程信息。

1. 最簡單直接的命令

git clone xxx.git

2. 若是想clone到指定目錄

git clone xxx.git "指定目錄"

3. clone時建立新的分支替代默認Origin HEAD(master)

git clone -b [new_branch_name]  xxx.git

4. clone 遠程分支

  git clone 命令默認的只會創建master分支,若是你想clone指定的某一遠程分支(如:dev)的話,能夠以下:

  A. 查看全部分支(包括隱藏的)  git branch -a 顯示全部分支,如:    

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev
  remotes/origin/master

  B.  在本地新建同名的("dev")分支,並切換到該分支

git checkout -t origin/dev 該命令等同於:
git checkout -b dev origin/dev

若是是先在本地創建了空的分支,要merge遠程分支,只須要查看branch -a 後,merge遠程分支

例如本地分支 master,遠程分支 origin/master

git checkout master
git merge origin/master

 另外有個git show HEAD 和log - p 顯示效果差很少。 

相關文章
相關標籤/搜索