Skip to main content

4 posts tagged with "git"

View All Tags

· 2 min read

Github 提供了「Pull Request」這種方便所有人先行審閱程式碼,在整併 (merge) 回各分支的方式。 有時候也會想先將程式碼下載回來執行看看效果。 目前我會使用的有兩種方式:

使用 diff

想要下載別人提交的程式,可以在 Pull Request 頁面網址後直接加上.diff,就會出現文字版的 diff 檔。

執行 git apply 1234.diff 即可使用; 測試完可執行git apply -R 1234.diff回復原狀。

使用 bash

~/.bash_profile 建立以下命令

pr() {
git fetch upstream pull/$1/head:pr-$1
git checkout pr-$1
}

初次使用時需執行 source ~/.bash_profile 或重開命令行。

之後只要執行 pr 1234 (1234 是 Pull Request 的編號),就會自動抓取對應的 Pull Request 並切換到相應的pr-1234分支。

這邊有範例程式 供參考。

· 3 min read

把過去半年本部落格上關於區塊鏈的文章整理放到 Gitbook。命名為Ethereum 區塊鏈!智能合約 (Smart Contract) 與分散式網頁應用 (DApp) 入門,對區塊鏈,智能合約,分散式應用 (DApp) 感興趣的讀者不妨前往一觀。

這不是我寫的第一本書1,也不是我第一本用 Markdown 寫的電子書 (以前用 Leanpub 出版過Firefox OS 開發書),但絕對是我編輯過程最順暢的一本書(雖然還未完成 XD)。

一路 Markdown

編輯過程最順暢不是因為對主題很熟悉或寫得快,而是因為從部落格文章初稿到 Gitbook,在寫作的過程中可以一路使用 Markdown。而且由於原本部落格圖片皆使用外連,因此引用圖片時也不用像以前編書時需要重新導入的過程。由於 gitbook 也支援mermaid.js插件,支援我常常使用的 flowchart 語法,因此這些流程圖也不需要重新截圖或繪製,節省了大量時間。

所見即所得編輯器...

我已有Markdown 格式的初稿,但剛開始我使用 gitbook 提供的所見即所得的編輯器。使用起來感覺非常不自在。

線上編輯器提供的new change request,所見即所得編輯等功能,特別是 gitbook 提供的所見即所得編輯器無法切換回純 Markdown 模式,對於已熟悉 git, Markdown 語法的我來說並沒有變得好用。直接將 Markdown 格式貼到編輯器上時,也無法順利辨識格式,反而是貼上已輸出的部落格網頁時效果好很多。

所以最後我放棄使用線上編輯器,而是在本機編輯 Markdown 後直接 git 推送到專案上。

gitbook 在同步收到新的改動後,會自動編譯並發布新版本,相當方便。接下來應該會繼續使用這個流程。

參考資料

· 3 min read

與其他人合作🤝使用 git 版本控制系統時,為了讓最後合併(Merge)的 commit 好看,常常會需要調整自己的 commit。

同時修改一個 commit

剛開始工作時一次只修改一個 commit,最常用到的命令是:

修改 commit 訊息 (message)

git commit --amend

在 commit 後加入--amend(修正) 參數,可以修改最後一個 commit 的訊息。

將後續修改合併成一個 commit

git rebase -i HEAD~2

將要合併的 commit 從pick改成s(squish) 後儲存,修改 commit 訊息後,可以得到剩下的一個 commit。

同時修改多個 commit

到後來為了讓審查 (Review) 更容易,漸漸開始嘗試在遇到某些較複雜的問題時,在同一個 Branch 堆疊多個 commit 的開發方式。

假設手上有 3 個疊在一起的 commit (commit 1,commit 2,commit 3. commit 3 是最新的 commit), 這時在修改的過程中會遇到的主要問題, 就是現在的修改與最新的 commit (commit 3) 無關,但與最前面的 commit (commit 1) 相關。 這時若想要將現在的修改與之前的 commit 1 合併,原本常使用的git rebase就不是那麼好用了。

為前面 commit 的打補釘

要為前面 commit 的打補釘,可以使用命令

git commit --fixup <commit>

<commmit>代表之前 commit (commit 1) 的 hash。輸入後最新的 commit 中會出現fixup <commit 1>的註記。

合併所有的補釘

當一系列修改完成後,只要使用命令

git rebase -i --autosquash

儲存後可以得到干淨的 commit 1,2,3🤘

修改任何之前的 commit 訊息

如果只想修改之前的 commit 訊息,可以用命令

git rebase -i HEAD~3

pick改成reword,儲存後就可以修改訊息。

參考資料

· 3 min read

'repo' is a good tool to manage project with multiple git repositories. Its developed to serve the need to manage Android Open Source Project (AOSP), which counts on bunch of open source projects. Then the 'repo' tool is used for chromium and chromium OS (known as open source version of Chrome browser and Chrome OS). Now Mozilla Boot-to-Gecko (B2G, known as Firefox OS) also adpot the 'repo' tool to manage multiple git repositories.

For a short time of experiment, I find its pretty simple to setup your own 'repo' that can help you manage multiple git repositories. Here is my findings.

To install 'repo' command, you can refer to Installing repo.

Make your own repo

All you have to do is:

1. setup an accessible git repository 2. Put a 'default.xml' file in it 3. Use 'repo init' command to access this  git repository.

Done!

Here is the default.xml sample, there are three main tags:

<div class="highlight">> <span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
> <span class="nt">&lt;manifest&gt;</span>
> <span class="c">&lt;!-- define hosts --&gt;</span>
> <span class="nt">&lt;**remote**</span> <span class="na">name=</span><span class="s">"b2g"</span> <span class="na">fetch=</span><span class="s">"https://github.com/mozilla-b2g/"</span><span class="nt">/&gt;</span>
> <span class="c">&lt;!-- default settings --&gt;</span>
> <span class="nt">&lt;**default**</span> <span class="na">sync-j=</span><span class="s">"4"</span><span class="nt">/&gt;</span> <span class="c"><!-- projects -->**project** remote="b2g" revision="refs/heads/master" name="gaia" path="."</manifest>Look at the 'project' tag. It describes that we'd like to sync the 'gaia' repository's 'master' branch from remote 'b2g' host.

Explaination

<?xml version="1.0" encoding="UTF-8">
<manifest>
...
</manifest>

The 'default.xml' syntax is wrapped by 'manifest' tag. It contains three parts of definition:

Hosts

<remote name="b2g" fetch="https://github.com/mozilla-b2g/"/>

remote' tag is used to define the hosts that we'd like to use in projects. Note that it's not the actual git URL, but where the git hosted on.We can specify the actual git URL in 'project' tag.

Projects

<project 
remote="b2g"
revision="refs/heads/master"
name="gaia"
path="."/>

The file describes that we'll like to sync the 'gaia' repository's 'master' branch from remote 'b2g' host.

The 'revision' path is defined within the original .git folder. To switch to branch like "v1.0.1", we could change  "refs/heads/master" to "refs/heads/v1.0.1".

It's almost the same as we have to do with git command.

By the way, default.xml itself is in a git repository, so you can specify versions by branch or whatever you like.

Defaults <default sync-j="4" />

In default tag we can specify the default values in project tag. ex: revisions, default repositories..., etc. 'sync-j' means with this setting, 'repo' command will download 4 resources at the same time.

The usage

Create a folder, switch in it, and run the following command:

> $ repo init -u https://&lt;your own git URL&gt;.gitThen, fetch the resources with command

> $ repo syncTo fetch a branch, run command
> $ repo init -u https://&lt;your own git URL&gt;.git **-b** &lt;branch&gt;

Read Git and repo cheatsheet for more details about how git and repo tool work together.  

Sample

Here is a working sample that able you to sync Mozilla Gaia repositorie, and automatically put vendor customization folder into its 'distribution/' sub-folder to ease the customization work.

https://github.com/gasolin/gaia-custom-repo

Update at 7/29:

A workable process elaboration in slide format http://gasolin.github.io/gaia-repo/