顯示具有 git 標籤的文章。 顯示所有文章
顯示具有 git 標籤的文章。 顯示所有文章

2013年1月30日 星期三

[GIT] 基本指令

#顯示目前索引有哪些檔案
#通常用在 , 如果不小心add或是要將已commit過的檔案從索引中移除而又不想要刪除檔案(也就是檔案仍存在)時使用
#顯示 sha1碼 , 及檔名
git ls-files --stage


#將t2.php從索引中移除
#通常與 git ls-files --stage 一起使用 , 先查詢要移除的檔案是否在索引中 , 再使用 git rm --cached t2.php 來移除
#並不會將檔案移除 , 只會將檔案從索引中移除
git rm --cached t2.php

#刪除repo,遞迴跟強制不詢問是否刪除。
$ rm -rf .git

#是看git 的commit線圖,要另外安裝
$ tig


init
#架一個server,本身不編輯檔案。如果架好了可以使用 git clone git@localhost:~/path   下載
$ git init --bare 



clone
git clone https://jexlin@bitbucket.org/jexlin/jexpoyi.git test
* 下載git的repo
* 指定下載後的資料夾名稱為test


remote
#查看remote目前有什麼
git remote

#刪除origin
git remote rm origin

#檢視目前origin的資訊
git remote show origin

#遠端branch更新到本機branch
git remote prune origin
* 遠端相關


config
#查看你的git設定內容。
#也可以使用cat ~/.gitconfig顯示你的.gitconfig設定
$ git config --list

#設定名稱;--global表示全域的設定。
$ git config --global user.name "jex"

#設定email
$ git config --global user.email "italwaysrainonme@gmail.com"
* git的設定檔


log
#加上--stat比不加上多出修改的地方
$ git log --stat

#精簡的log,每一次的commit資訊為一行,只顯示前7碼的SHA1及message
$ git log --oneline
* 查看commit紀錄


branch
#開一個分支叫做develop
$ git branch develop

#列出所有branch
$ git branch
  develop
* master

#顯示branch的資料
$ git branch -a
  develop
* master
  remotes/origin/master

#顯示branch的詳細資料
$ git branch -v
  develop 3536c6e 20130408 01:30 no send email and OK page
* master  3536c6e 20130408 01:30 no send email and OK page

#列出已經merge的branch
$ git branch --merged
  develop
* master

#列出尚未merge的branch
$ git branch --no-merged

#修改branch的名稱。,develop改成developXD
$ git branch -m develop developXD

#刪除branch
$ git branch -d developXD
Deleted branch developXD (was 3536c6e).

#看remote branch
$ git branch -r
  origin/master
* 分支


merge
#加上 --no-ff 作用是讓commit log紀錄您是開分支出去再merge回來的。
$ git merge --no-ff develop
* 合併分支
* 參考appleboy教學


add
#還不知道--patch用途
$ git add --patch
Only binary files changed.
* 增加進stage
* y 加到stage
* n 不要加到stage
* s 可以拆小一點hunk



checkout
#還原修改過的檔案
#1. 新增一個dd.txt的檔案,裡面文字輸入"123"
#2. git add dd.txt (加入stage)
#3. 將dd.txt的文字資料由123改為456
#4. 我後悔了,我想還原此次修改
#5. 輸入:$ git checkout -- dd.txt
#6. 資料確實還原為123了
$ git checkout -- 

#新增develop並且切換過去
$ git checkout -b develop

#myfeature會是由develop分支出來的branch
$ git checkout -b myfeature develop

#使檔案回復成最近一次commit的狀態
$ git checkout -- test.php

#強制回復己在add狀態被修改過的檔案, Untracked files則不受影響
git checkout -f

#所有track中且修改過的檔案回復成最近一次commit的狀態
git checkout .
* 切換branch


commit
#--amend改變最後一次commit訊息
#1. 假設最近一次commit的訊息是QQQ
#2. 然候我修改了一份檔案,突然想到,剛剛的commit訊息打錯了
#3. 於是輸入:$ git commit --amend -m "XXX" ,將原本訊息的QQQ改成XXX
#註 : 但是注意,雖然語法有commit,但是並不會將剛剛修改的檔案commit到最近一次的commit
#     ,所以可以放心使用,只僅僅會改變最近一次commit的訊息而已,資料不會變動
$ git commit --amend
* 提交


diff
#比較上一個commit的差異
$ git diff HEAD^

#觀看非stage與上一版本的差異,未add過
$ git diff --

#觀看stage與上一版本差異,已add過
$ git diff --cached

#比較branch的差異
$ git diff branch

#查看差異的概要
$ git diff --stat

#比較兩個commit差異
$ git diff sha1..sha1
* 比較差異
* ctrl + z 離開


pull
#避免不必要的 Merge
#公司的高手教學:
#Joseph: 我們常常在 git pull 時會產生一次的 Merge 也就是針對你本地端的 Repo 跟 miiicasa 的 Repo
#        所以在 commit log 上都會有一堆 Merge 的訊息,但其實這個是沒必要的垃圾訊息,可用此避免。
#Ash Wu: 可以在 ~/.gitconfig 設定
#        [branch]
#          autosetuprebase = always
#        就可以預設 git pull --rebase 了,當然,需要不 rebase 的狀況可以用 git pull --no-rebase。
git pull --rebase
* 將repo從git server拉回本機


push
#加上 -f 是強制push, github之前的commit 紀錄會不見,只會有目前這個branch的commit 紀錄
$ git push origin master -f






---
參考資料:
http://blog.wu-boy.com/2011/03/git-%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6-branch-model-%E5%88%86%E6%94%AF%E6%A8%A1%E7%B5%84%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%B4%B9/

[GIT] 設定.gitignore 忽略檔案不被track

這是一個簡單的範例幫助你忽略某些檔案 , 使其不被track

2012年12月20日 星期四

[git][merge]實際操作,合併與他人做的專案

我是個初學者,但我一直連最簡單的合併都做不好,一直以來我有個問題是想要將同事寫的與我寫的合併在一起。其實這個問題我在網路上問了兩次,結果兩次都領悟不出來網友說的merge觀念...慚愧..,終於...今天我像是被電到一樣突然想通了,其實道理也是很簡單--branch的parent一定要同一個(分支要由同一條主線分出來就對了!),此方法適合與未使用git的人合併專案。

2012年12月10日 星期一

[git][merge]實際操作,合併流程,包含處理conflict

branch介紹:
*master是主支  (預設branch停在這條)
develop是master的分支,所以檔案與master一模一樣
測試檔案:
test.php
test2.php

先分為兩種情況

第一種情況:master都沒修改過
  1. git checkout develop                               切到develop
  2. 修改test、test2及新增test3                   做些修改
  3. git add .                                                   新增進stage
  4. git commit -m "develop commit"               commit
  5. git checkout master                                  切到master
  6. git merge develop                                     合併develop
  7. 這時候master的資料就和develop一模一樣了 ^^
  8. git branch -d develop                               刪除develop
  9. git checkout -b develop                            新增剛合併完的master分支,所以這條develop是最新的資料,並且將線切換過去了,因為(checkout語法)
  10. 接下來可以繼續以develop 開發,重覆著2~9的動作
第二種情況:master被修改過(合併就會出現conflict)
   檔案一樣先回到最上面的假設
  1. 修改test test2 新增了test3 test4            (目前是在master)
  2. git add .                                                  新增進stage      
  3. git commit -m "master commit"                commit      
  4. git checkout develop                               切到develop
  5. 修改了test test2 新增了test3                不增加test4
  6. git add .                                                  新增進stage  
  7. git commit -m "develop commit"              commit      
  8. git checkout master                                  切到master準備合併
  9. git merge develop                                    因為master與develop檔案不同(不同的狀況與情況一不一樣)所以會產生conflict
  10. 因為master有develop沒有的test4,所以test4沒有conflict,但其餘三個有,各別開檔案進去裡面修改
  11. git add .                                                  將修改完的檔案add進stage
  12. git commit -m "merge done"                     commit
  13. git branch -d develop                               刪除develop,目的是建一個最新版的develop
  14. git checkout -b develop                            新增develop並且將線切到develop(其實這一行等於git branch develop + git checkout develop)
  15. 繼續開發你的develop
情況二的9. (conflict)



注意 : 如果只有自己一個人開發的話,建議主線就是master,並且每當合併完後,新增一條develop繼續開發(master那邊不要動),否則master那邊做一點,又跑到develop那做一點,合併時會產生情況2的conflict問題,處理起來也挺麻煩的。每當功能完成後要合併時,合併完後,一樣master不要理它,開一條develop繼續做,一直重覆這個循環開發就對了^^

2012年12月9日 星期日

[git][reset] 回覆上一個動作

git reset HEAD^ --soft 取消剛剛的commit但保留修改過的檔案

  1. 修改一份.php檔加上隨意字串,例如:"QQQ"
  2. git commit -a -m "edited"
  3. 我後悔了,我要回復上一動,但又希望剛剛輸入的"QQQ"還在
    git reset HEAD^ --soft
  4. git log 查看commit紀錄,剛剛commit的真的不見了,且"QQQ"也還在

git reset HEAD^ --hard 取消剛剛的 commit,回到再上一次 commit的 乾淨狀態

兩種情形:

  • 接續剛剛上面的情形,假如已經git reset HEAD^ --soft後,但又後悔不想保留"QQQ":
    輸入:git reset
    HEAD --hard  回覆到最近的一次commit,並且已修改的檔案還原到原始狀態,
    注意:如果你想還原全部修改過的檔案才使用此操作
  • 正常情況:
  1. 修改一份.php檔加上隨意字串,例如:"QQQ"
  2. git commit -a -m "edited"
  3. 我後悔了,我要回復上一動,但希望還原到上一個commit的原始狀態,也就是修改過的資料不保留
    輸入:git reset HEAD^ --hard
  4. git log 查看commit紀錄,剛剛commit不但不見了,也還原此commit的原始資料狀態
可以參考另外這篇有指令的集合:http://gogojimmy.net/2012/02/2...


$ git reset HEAD <file>:將剛剛add的檔案還原成untracked(unstage)
  1. 新增ddd.txt   (形態為unstracked)
  2. git add ddd.txt (形態變為 Changed to be commit)(stage)
  3. git reset HEAD ddd.txt (形態變為unstracked)








2012年12月7日 星期五

[git] gitk 指令,顯示樹狀圖形化介面

$ gitk         顯示
$ gitk --all  也是顯示(不知道與沒加--all的差別)
$gitk &    背景執行,但不會reload