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

2017年9月8日 星期五

git branch have diverged

============ 當 Conflict when git pull =====================

如果 git pull 時發現有 Conflict, 但你又明明沒有加入任何 commit,
有可能是因為原來的 branch 已經走到分支出去了,
你可以打入 git status

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 32 and 83 different commit(s) each, respectively.
#

第一個數字 32 代表著你比 origin/master 多了 32 個 patch, 第二個數字 83 代表著你比 origin/master 少了 83 個 patch 如果你很有興趣知道是那一些可以利用 git cherry origin/master 來看

1. 執行 git reset --hard HEAD^ 一直到你可以做 fast-forwarded

2. 直接執行 git pull --rebase origin/master

http://pjack1981.blogspot.tw/2012/03/git.html
https://github.com/zlargon/git-tutorial/blob/master/remote/sync.md

2017年6月21日 星期三

Jenkins tips

Jenkins 注意的點, for Android Repo project

1. Use Gerrit Repo plugin, Manifest Branch的部份不需填入branch name. 在後面shell command部份使用repo start切branch即可, manifest branch亂填會導致xml檔錯誤.

2. Gerrit Repo plugin不是非常好用, 有些command的參數無法自己下, 推薦還是使用shell command直接做想下的repo command即可.

3. Gerrit trigger plugin: 先參考plug in wiki上在Gerrit server上做好Jenkins帳號的權限設定.
https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger#GerritTrigger-SetUp

4. Gerrit trigger plugin: Gerrit server如果設好之後test connection就會顯示success, 如果test ok但是上層的gerrit server status一直有問題的話, 重開Jenkins server. 如果ssh key有改名或換檔案, 也需要重開Jenkins server.

5. Gerrit trigger plugin: 在工作中的設定, path 設**會去monitor 目錄下所有的project, Branches設plain branch_name.

6. Gerrit trigger plugin: plugin可使用下面這行command, 就會merge進此patch,
repo download $GERRIT_PROJECT $GERRIT_CHANGE_NUMBER/$GERRIT_PATCHSET_NUMBER
Note: merge之後並不會自動revert, code會留在目錄中. 需注意$GERRIT_PROJECT, 他會去抓gerrit上的project name, 如果project path有多幾層的話, 可以用sed刪除字串再丟回download path.

7. Shell command中如果使用cp, rm, mkdir需注意權限. copy檔案到/var/lib/jenkins/以外的路徑需先把目錄權限設到777


2016年8月11日 星期四

Git常用狀況

git的四個folder
remote repository<---->local repository<---->stage<---->working directory

1. 初始download 資料夾from server
$git clone server_name aa  aa是folder name可以自己建

2. 修改完code之後要傳上server
$git add filenameA filenameB      將檔案都丟進stage
$git commit -m "log message"      將檔案commit上local repository
$git push                                        將修改的部分真正傳到server

git add的部分,如果有把握的話可以使用$git add . 會將整個working directory有修改過的檔案都丟進stage,如果沒把握請勿使用,避免傳上不知道狀況的檔案.

3. 更新自己的code到server上最新的code
$git fetch                           更新local repository與remote repository一致
$git merge origin/master   將working directory更新與server上一致,如果有conflict會出現在這邊

如果要看server上改了什麼在git fetch完之後
$git checkout origin/master
$gitk -a

4. 修改conflict的方式
$ vim conflict_file_name
進去之後會看到類似的情況
<<<<<<< c97e4c60de36e44afd801cf0d22aab1399e9269c
123
=======
456
>>>>>>> conflict example
<<<跟>>>中間的部分是git無法merge的部分,===上面是A版的code,===下面是B版的code,自己修改完之後,記得將<<< >>> ===都刪除, press esc-->:-->wq 儲存離開

5. rollback code的方法
如果是本機上的單支code改亂了,要revert到沒改過的狀況
$git checkout file_name
如果是整個資料夾都改壞了,要全部檔案rollback
$git reset --hard HEAD

6. rollback小板的方法
如果只是某幾支檔案要退回xx版,來驗證東西的話
$git checkout xxx_version fileA fileB fileC   可以將特定檔案rollback回xxx version






2016年8月9日 星期二

Git 基本指令

1. git config --list  list all config
2. git config --global xxxxx  ex, git config --global user.name "Jerry"  change user name
3. git init 在任何想要initial成git folder的地方下
4. git clone http://127.0.0.1/ xxxx   clone遠端server的folder下來, xxxx是抓下來的folder名字
5. git status 確認目前有任何的檔案的被更動
6. git add filename 將修改過的檔案加入stage(index)
  a. git add .  將所有修改過的檔案加入
  b. git add -i  使用互動式介面來修改檔案
7. git commit  將在stage中的檔案commit進去
  a. git commit -m "xxxxx" 直接加入commit message
8. git log  查看過去commit的log
  a. git log --stat  detail information
  b. git log xxxx  顯示出特定版本的log
  c. git log filename 特定檔案的log
  d. git log -p filename 特定檔案詳細更改的log
ex:
commit 7e56e3f83c0ac52218b25db1514423d07ae0449d
Author: Jerry Lain <hyde545@gmail.com>
Date:   Wed Aug 3 17:32:06 2016 +0800
$git log 7e56  7e56e3f8  7e56e3f83c0a 都可以
9. git branch   list出現在有哪些branch並告訴你現在在哪個branch
  a. git branch xxx  開出一隻新的branch
  b. git branch -d xxx  移除xxx branch
10. gitk --all  GUI介面list出來所有的commit log
11. git checkout xxx 切換到xxx branch
  a. git checkout fiename 將單支檔案回復到未改過的狀態,如同SVN的revert
  b. git checkout xxxversion filename  切換本機特定檔案跟stage index到某一版本
12. git rebase yyy 將目前branch的修改base on yyy branch的功能合併起來,rebase是在yyy branch中更改一份跟原本branch一樣的修改. 在branch出來的位置rebase回master. 否則會變成在branch中更改master,不太符合master是主要分支的概念. rebase完之後需再回到master做一次merge. 這樣的情況下最後得到的結果會與merge一樣,只是在git線圖上可以得到一個更簡潔的圖. rebase之後所有修改的部分都在同一支線中,如果要reset回去的話就不會有分支的問題,直接merge的話,reset回去到分支的版本中會有branch A與branch B兩隻分支檔案不同的問題.
由於rebase是在master上再修改一次,所以branch 的每個checksum會改變.
由於rebase是在master上一版一版修改的加上去,所以conflict的部分也是需要一版一版解決.
merge則是將master與branch合併之後產生一版新的版本,所以conflict一次解決就好.

不要rebase在遠端的資料庫,只能在push之前將local資料庫的history整理好,因為rebase會更改SHA-1的值,rebase遠端的資料庫會將遠端的history打亂,造成其他使用者重複合併修改過的內容以致history大亂. 可以參考https://git-scm.com/book/zh-tw/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E8%A1%8D%E5%90%88 最下方衍合的風險

git rebase onto new-version current-version 將current version"嫁接"到new version上

https://blog.yorkxin.org/2011/07/29/git-rebase

13. git merge xxx  merge是將現在的分支跟xxx分支合併後產生一版新的提交. 在master merge xxx branch才會讓master分支繼續往下走.

遇到conflict時,修改完之後都需要先git add . 將修改的檔案加入stage,接著
rebase: git rebase --continue 讓他繼續做rebase的動作.
merge: git commit 讓他commit一版










14. git reset  回復到某一版本
  a. git reset --hard HEAD 將所有的檔案都回復到HEAD版本
  b. git reset HEAD 本地資料夾中的資料不改,stage的檔案回復,線拉回前一版
  c. git reset --soft HEAD  只有線拉回前一版
  d. git reset HEAD^^ , 也能使用git reset HEAD~2, 回到兩版之前的資料
b and c的情況因為線已經拉回前一版了,所以本地中的檔案不會有任何變動,但是git status會變成需add and commit

退版的方法
1. git checkout xxversion  file_a file_b file_c   只有本機檔案會更動.
2. git revert xxversion  會將xx version更改的檔案rollback並commit進history
3. git rebase -i xxxversion  會列出中間所有version,刪掉那行就會rollback,也會從history中刪除,不留痕跡.


12. git push  將目前的folder push回原本clone的位置
沒有merge到master的資料無法push回去
master branch 是主要的branch,所有修改完的東西都再回到master branch

remote repository, origin/xxx branch
$git checkout origin/master 切回遠端的master

git pull = git fetch + git merge origin/master
git fetch先將local的repository的origin/master更新到server上的位置,再將local master與origin/master merge整個動作就等於 git pull, 所以建議將兩個動作分開, 多使用git fetch

git fetch之後如果要看remote master改了什麼,需要先checkout to origin/master再下gitk才能看

push new branch
git push origin aabranch  aabranch必須是本機上有的branch 而不能直接建新branch到remote

刪除branch
git branch -d aabranch  本機刪除
git push origin :aabranch  remote刪除

git - 後面接一個字的縮寫ex. git config -l 
git -- 後面接全名 ex. git config --list

2016年8月8日 星期一

Git 相關backup

http://learngitbranching.js.org/index.html
http://it.tomtang.idv.tw/2013/08/svn-git.html
http://www.hitripod.com/blog/2012/07/why-not-switch-to-git/
https://marklodato.github.io/visual-git-guide/index-zh-cn.html
http://blog.jobbole.com/20069/

GIT 非常強調 branch & merge 
每一個 repository 其實都是一份 snapshot
假設 SVN TRUNK 開了一個專案,加了一點權限
這專案如果要開 branch,權限是不會跟過去的,必須自己手動加上
而 GIT 不用,因為是 snapshot ,所以一開好 branch 就有權限設定了。