2017/6/19

Git

一些和git相關的東西
如果有裝Xcode的話,通常也會幫你裝好git了 [1]
打$ which git
會在/usr/bin/git

看一下版本
$ git --version
版本應該也不是最新的,那當然想要把它更新到最新

那我似乎只是去git官網下載最新的git .dmg檔案來安裝
並且重啟iterm2
這時再看一下它的位置:
$ which git
已經在/usr/local/bin/git

再看一下版本確認一下:
$ git --version
git version 2.13.1
恩...很神奇的幫你更新了,一開始我以為還要更改路徑之類的,但重啟iterm2就自動幫我做好了

設定一些初始資料:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

可利用cat來查看gitconfig,裡面存著剛剛設定的資料:
$ cat ~/.gitconfig

確認剛剛的設定:
$ git config --list
會列出所有的設定資訊

讓git輸出有顏色:
$ git config --global color.ui true

開始操作git做版控
首先要切換到要做版控的專案資料夾,在下init指令前先下:
$ git status
fatal: Not a git repository (or any of the parent directories): .git
來查看一下目前的狀態

現在要建立一個Repository
$ git init
Initialized empty Git repository in /Users/xanxus/Downloads/我的專案/.git/
一定要切換到專案資料夾才init,直接init會整個電腦都版控!!!
再看一下狀態:
$ git status
On branch master

Initial commit

Untracked files:
  (use "git add ..." to include in what will be committed)

 code1.java

nothing added to commit but untracked files present (use "git add" to track)
會發現已經起了變化。
On branch master表示目前處於名為master的分支上

將檔案加入追蹤:
$git add code1.java
或用
$ git add .  會將所有檔案加入追蹤
再$ git status看一下狀態:
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached ..." to unstage)

 new file:   code1.java
可看到new file: code1.java 表示準備被提交(commit)

取消追蹤檔案:
如果不小心把不需要版控的檔案add
add之後,回應的訊息是綠色的,說你可以準備commit:
但如果add錯了,這時我們要把它取消:
$ git rm --cached NewServlet.java
rm 'NewServlet.java'
可以看到變紅色了,表示變回未add的狀態


進行版本提交:
$ git commit
$ git commit -m "提交訊息"
第一個會開啟編輯器,讓你輸入提交訊息,內容可以輸入蠻多的
第二個直接打提交訊息可直接提交
這裡使用第一個:
$ git commit
[master (root-commit) 7a3e22a] 第一次提交檔案
 1 file changed, 160 insertions(+)
 create mode 100644 code1.java
看一下現在狀態:
$ git status
On branch master
nothing to commit, working tree clean
表示目前沒有未被追蹤或修改過的檔案

查看提交紀錄:
$ git log
commit 7a3e22aeac732a7986ed1aff2d4d09047123ed25 (HEAD -> master)
Author: 你的名字 <你的Mail>
Date:   Mon Jun 19 05:22:20 2017 +0800

    第一次提交檔案
7a3e22aeac732a7986ed1aff2d4d09047123ed25 是提交版本的ID

如提交次數過多可用:
$ git log -"數字"
限制顯示log數量

流程整理:

  1. 初始化儲存庫
  2. 對檔案做新增修改
  3. git add:選擇欲加入本次版本的變更檔案
  4. git commut:將本次版本進行提交
  5. 回到第2步
那現在再練習一次:
做個小測試,我現在對code1.java的內容隨便打幾個字,在看一下status
$git status
On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

 modified:   code1.java

no changes added to commit (use "git add" and/or "git commit -a")
會發現這行modified: code1.java
表示我修改了這個檔案
我很無聊又把修改的內容刪掉再status一次,就會變回沒修改的狀態:
On branch master
nothing to commit, working tree clean
很顯然地已經對他做版控了

又重複2~5的步驟,並再看一次log:
commit d3952901e08d53a93b693c041ead01d850276456 (HEAD -> master)
Author: 你的名字 <你的Mail>
Date:   Mon Jun 19 05:42:00 2017 +0800

    第二次提交

commit 7a3e22aeac732a7986ed1aff2d4d09047123ed25
Author: 你的名字 <你的Mail>
Date:   Mon Jun 19 05:22:20 2017 +0800

    第一次提交檔案
(END)
原來這就是git的感覺啊
要離開這個畫面按q就可以了!


--amend指令:修改上一次commit提交的訊息
在這之前記得到你有被版控的資料夾
$ git commit --amend
就會開啟這個畫面讓你修改提交訊息

[master 630413e] 第二次提交(修改版Ver2)
 Date: Mon Jun 19 05:42:00 2017 +0800
 1 file changed, 1 insertion(+), 1 deletion(-)
回來後會出現這樣的訊息,會看到你修改的訊息

checkout指令:復原被更動的檔案(回到你最後一次commit的版本)
使用情境:
如果今天程式碼改壞了,就可以回到上次的版本
$ git checkout code1.java
可以把程式碼先開起來,隨便改改,我把程式碼整個刪掉,下指令後它都可以復原!非常厲害。

$ git checkout -f
把所有檔案回復到上次commit

$ git checkout 7a3e22aeac732a7986ed1aff2d4d09047123ed25
回復到7a3e22aeac732a7986ed1aff2d4d09047123ed25這ID的code

reset指令:回到某ID對應的commit狀態(跟checkout不同)
與checkout功能不一樣!checkout是回到上一次的code,但reset是回到某commit的狀態,也就是從最新的節點,移動的指定的節點。
在這之前先用$ git log 來看你要回到哪個ID
先來試試$ git reset 7a3e22aeac732a7986ed1aff2d4d09047123ed25 --hard
7a3e22aeac732a7986ed1aff2d4d09047123ed25就是這檔案某次commit的ID,後面--hard表示不保留其他commit的紀錄.......
再$ git log看一下
會發現只剩下剛剛回到那個ID的commit紀錄,所以只有一筆log

$ git reset 16522ce7b5daf6f76203a91f27f9fb689a4d9089 --soft
後面的--soft指會保留其他commit狀態,並移動到這個ID的commit狀態

$ git reset --hard a40b64af845b1baa408ee578562ef3a31e62905c
可回覆到某個版本的內容,但其他commit紀錄都會被移除


Github SSH key設定
先進到帳號設定SSH這裡


第一步:產生SSH Key
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
最後面換成你的Email,例如:
$ ssh-keygen -t rsa -b 4096 -C asd12345@example.com

之後會出現一些訊息就按Enter就好....

第二步:確認是否產生成功Key
輸入:
$ ls -al ~/.ssh
成功的話會有id_rsa和id_rsa.pub兩個東西

第三步:加入SSH Key至SSH-agent
按照他下這個指令:
$ eval "$(ssh-agent -s)"
Agent pid 59566

在~/.ssh/config新增內容為下的片段(config沒有就自己建)
Host *
 AddKeysToAgent yes
 UseKeychain yes
 IdentityFile ~/.ssh/id_rsa

最後再下:
$ ssh-add -K ~/.ssh/id_rsa
Identity added: /Users/xanxus/.ssh/id_rsa (/Users/xanxus/.ssh/id_rsa)

第四步:加入SSH Key至Github
用以下指令把SSH複製起來:
$ pbcopy < ~/.ssh/id_rsa.pub選New SSH key
輸入Title
內容就把剛複製的SSH貼上
點Add SSH key
完成!

第五步:測試SSH與Github是否連接成功
$ ssh -T git@github.comThe authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?
這是正常的,成功的話會看到一組IP

那當然要答yes
Please type 'yes' or 'no': yes
Warning: Permanently added 'github.com,192.30.253.112' (RSA) to the list of known hosts.
Hi 你的名字! You've successfully authenticated, but GitHub does not provide shell access.
看來是沒問題

把本地儲存庫的檔案上傳到Github
第一步:先在github創新的儲存庫,不要勾readme檔案
第二步:把本地儲存庫先init並把要上傳的檔案做版控
$ git init
$ git add code1.html
$ git commit -m "初始化"

上傳至github
$ git remote add origin git@github.com:YourName/Homework.git
$ git push -u origin master
這樣就上傳上去了

Note:

  1. Github儲存庫中,左上方的commits次數就是每個檔案commit的總次數,如我檔案1 commit五次,檔案2 commit四次,那左上方commits次數就是九次。
  2. 點進左上方commits中,可看到每次commit的紀錄:
    再點進某次commit,例如我點"第三次修改":
    可看到這次commit中我程式碼修改的部分。
    3. 修改了兩個檔案,一次add兩個檔案,也一次commit兩個檔案,是可以的,Github中會長這樣:



…or create a new repository on the command line

echo "# ParseRouteInstruction" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:你的名字/ParseRouteInstruction.git
git push -u origin master


…or push an existing repository from the command line

git remote add origin git@github.com:你的名字/ParseRouteInstruction.gitgit push -u origin master

不能傳github的解決方案:
發生原因:貌似我用--amend改commit紀錄後,就不能直接push
以下跳出的訊息
➜  ParseKeelungShopJson (master) ✔ git push -u origin master
To github.com:你的名字/ParseRouteInstruction.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:你的名字/ParseRouteInstruction.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
原因是github上面的版本比較新,因為--amend後,本地的版本是回到之前的版本
這時要先pull
➜  ParseKeelungShopJson (master) ✔ git pull origin master
From github.com:你的名字/ParseRouteInstruction
 * branch            master     -> FETCH_HEAD
Merge made by the 'recursive' strategy.

這時會跳出一個畫面,貌似要你寫merge的訊息

出去後就可以push了
➜  ParseKeelungShopJson (master) ✔ git push -u origin master
Counting objects: 2, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 480 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To github.com:你的名字/ParseRouteInstruction.git
   6230920..d66350a  master -> master
Branch master set up to track remote branch master from origin.


參考資料:

  1. Install and Update to latest version Git on Mac OSX 10.11 El Capitan
  2. https://dotblogs.com.tw/wasichris/2016/04/29/225157
  3. https://dotblogs.com.tw/wasichris/2016/05/07/231839
  4. SSH keyhttps://nyllep.wordpress.com/2012/01/21/sshkey-for-bitbucket/
  5. https://stackoverflow.com/questions/37937984/git-refusing-to-merge-unrelated-histories
  6. 不能push的解決方案 https://noootown.wordpress.com/2015/06/19/git-first-use/

沒有留言:

張貼留言