Code Monkey home page Code Monkey logo

learn-git-in-30-days's Introduction

30 天精通 Git 版本控管

作者: 黃保翕 (Will 保哥)

Git

文章簡介

在軟體開發領域,對原始碼進行版本控管是非常重要的一件事,有別於 Subversion 或 TFS 這類集中式版本控管系統,Git 是一套分散式版本控管系統,並帶來許多版本控管上的各種優勢與解決傳統集中式版本控管的缺失,例如支援本地操作、備份容易、功能強大且彈性的分支與合併等等。不過,由於 Git 版本控管無論在版控觀念與工具使用上,都與傳統集中式版控工具差異甚大,因此造成了不小的學習門檻,在未來的30天內,希望能讓大家完整了解 Git 版本控管的精髓之處,並整理我的學習心得與我們公司從 Subversion 轉至 Git 的過程中所遭遇的問題與解決方法。

旅程從現在開始

獲獎紀錄

與我聯絡

Stargazers

Stargazers repo roster for @doggy8088/Learn-Git-in-30-days

learn-git-in-30-days's People

Contributors

agudoe2 avatar alantsai avatar bobo52310 avatar brad0924 avatar chnbin avatar doggy8088 avatar hochange avatar lycheeeng avatar maschinist-lzy avatar mikechan0731 avatar obelisk0114 avatar pajace avatar ppcat avatar re757575 avatar scgeeker avatar skchang0710 avatar soniccol avatar sujunmin avatar vincechang1015 avatar wingedrobin avatar yuelinho avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

learn-git-in-30-days's Issues

第 4 天和第 18 天的 git reset

第 4 天的 重置目前的工作目錄 裡面提到可以利用 git reset 重置目前工作目錄的索引狀態,使用 git reset --hard 工作目錄也會還原。第 18 天則又提到 git reset --soft 也只會重置目前工作目錄的索引狀態。這是不是說 git resetgit reset --soft 是一樣的 ? git reset --soft "HEAD^" 也可以改成 git reset "HEAD^" ?

增加閱讀的便利性?

保哥您好,

十分感謝有您的大作,才能比較無痛學習Git~

一點建議:每日課程的最後,或許可以增加「上一日」、「下一日」的連結,能增加閱讀的便利性。

I just created an account

I'm new to this whole thing, my ex of 13 years and her fuck buddy hacked my phone using vs code and GitHub and they have taken all my accounts and money off my iPhone I need to learn how to code asap so I can understand what happened

第 13 天暫存版

在官方文件
https://git-scm.com/docs/git-stash
看到 save 和 push 放在一起, 不過並未多著墨兩者使用時機差異, 請問兩者是差不多嗎 ?

git stash 之前若有一些檔案已經加入索引 (staged) 的話, git stash 之後也會和未被加入索引 (unstaged) 一起被還原。因此三個 parents 的第二項 "原本工作目錄所包含的索引內容", 個人覺得應該改成 "原本工作目錄所追蹤 (tracked) 的內容" 較好。若要套用已經加入索引 (staged) 而不必回溯的話, 可以加上 --keep-index 而成 git stash save --keep-index。加上 -u 可以連 untracked file 一起。

還有一個很有趣的參數, -p, 可以使用互動模式讓使用者可以看檔案更動哪些部分, 不過不能暫存 untracked file

關於範例的指令

有個小小建議,
目前看到第十五天,發現範例中越來越多使用alias,
雖然在【第 14 天: Git for Windows 選項設定】有介紹過相關指令,
但考慮到可能閱讀者不是從頭學到尾的人,而是在找相關訊息的人,
且對git指令還不很熟悉,如果要直接查看其中一天的文章,
可能會無法馬上明白範例的指令,在想是否還是將完整指令打出來會比較好?

只是個人目前學習的小小建議,感謝寶哥的資源,受益良多。

第 11 天: Git 物件的一般參照

在工作目錄下直接執行 git update-ref InitialCommit <commitID> 。之後再執行 git update-ref -d InitialCommit 會出現 error: refusing to update ref with bad name 'InitialCommit',而且使用 git show-ref 也不會找到他,但是他的確在 .git 下面, git cat-file -p InitialCommit 會正確執行。

若手動刪除他,將 update-ref 的參照名稱改成其他的話,大部分都無法被 update-ref -d 找到而刪除。有一些情況可以被找到而刪除,不過 git show-ref 仍然找不到。

但是只要設定參照名稱時,將位置改掉,像是 git update-ref refs/InitialCommit <commitID> 。之後就可以正確被 git show-ref 找到,也可以使用 git update-ref -d ref/InitialCommit 來刪除。但是執行 git update-ref -d InitialCommit 仍然會失敗。是不是 Git 不支援尋找,而且 .git 目錄下也變成 "真空區" ?

關於第三天的小疑問

在 "在本機建立一個共用的儲存庫 (shared repository)" 的 section 下,想請問一下 "...必須先取得這個「裸儲存庫」的內容回來,這時你必須使用 git clone [REPO_URI] 指令「複製」(clone) 一份回來才行..." 中的 REPO_URI 是否是 REPO_URL 的小筆誤呢?

關於 remote 相關指令的一些細節

保哥您好,讀了您的教學,覺得頗有幫助。不過關於第 25 天的一些說明,覺得可以多介紹一點。

首先我看不太懂您談到的四種分支,你寫的「本地追蹤分支」似乎是指 git 文件中說的 remote-tracking branch (根據 git branch -h 對 -r 參數的介紹 "act on remote-tracking branches"),而 remote-tracking branch 意即「追蹤遠端的分支」,不過國人習慣頗可能譯作「遠端追蹤分支」。您說的「遠端追蹤分支」我則看不太懂是指什麼。

也許您可以提一提 git branch -vv,這是一種有點特別的用法,會列出本地分支及對應的遠端追蹤分支。而 git checkutgit branch--track (-t) 參數與 git pullgit pushgit branch--set-upstream (-u) 參數感覺很容易混淆,也許可以介紹一下。

我個人在接觸 git fetchgit pullgit push 時,經常被各種預設情形搞混,得到非常意外的結果,如果可以進一步介紹各指令在部分省略時會有什麼行為,也許會對不熟悉的人很有幫助,比如:

# -- fetch
git fetch origin master:master
git fetch origin master
git fetch origin refs/notes/commit
git fetch origin
git fetch
git fetch --all

# -- pull
git pull origin master:master
git pull origin master
git pull origin
git pull
git pull --all

# -- push
git push origin my_master:master
git push origin :mybranch
git push origin master
git push origin
git push origin --all
git push origin --tags
git push origin --mirror
git push
git push --all

最後挑個錯字:「如果你想明確下**在(->載)**特定幾個分支就好」

裸儲存庫疑問

保哥前輩 不好意思
我有先在it邦發問
但怕您沒有再繼續使用it邦
所以轉來您github上發問
最近在裸儲存庫上一直有疑問

1.在您的"在本機建立一個共用的儲存庫 (shared repository)"中
若是我想讓該專案在此主機(本機)上可以運行
主機是不是就該採用git init 的作法
畢竟裸儲存庫沒有工作目錄

2.承上述
若上面的回答是Yes的話
我想請問何時會有只記錄版本的情況產生
那台機器純粹是記錄版本和給共同開發的人員clone用嗎?
所以會把整個專案再丟到另外一個主機運行嗎?

3.為何大多數的文章都建議遠端是用裸儲存庫開發
這是我很好奇的
其實跟前面兩個問題應該蠻類似的
主要我是不懂裸儲存庫的好處到底是什麼
他做得到的git init也做得到阿

4.git是否能夠取代ftp
目前小弟我有嘗試出這種方法
以下是步驟
1.在遠端(主機)建立一個儲存庫(非裸)
2.本地端clone下來
3.本地端修好程式push上去
4.遠端checkout 新版本(如此便會更改工作目錄的程式)
這樣既可以記錄又可以做到遠端開發的感覺
不知道這樣的流程是否正確

新增簡報

如果採用,此提交將新增一個簡報檔
如果採用,此提交將第01天:認識Git版本控管完成
如果採用,此提交將第02天:在 Windows 平台必裝的三套 Git 工具完成
如果採用,此提交將第03天:建立儲存庫完成
如果採用,此提交將第04天:常用的Git 版本控管指令撰寫到一半
Learn-Git-in-30-days.pptx

第八天裡面的一個指令小問題

保哥好
正在拜讀您的大作,讀到第八天發現這段指令中

echo. > a.txt
git add .
git commit -m "Initial commit"

第一行的echo後面似乎多了一個點
或是echo和點中間少了一個空格
辛苦了,網路上看了很多東西都沒有您說的容易了解

第08天:似乎有一"點"小筆誤

2016-06-24 11 19 56

第08天的指令範例中 echo 的後面多了一點,雖然不是在很重要的地方,但是想一想還是提出來好了。 順便說一聲這篇寫的很棒喔!!

第 24 天:使用 GitHub 遠端儲存庫 - 入門篇 -- 範例照打無法成功

zx1

在嘗試將本地已建立本版的local repo上傳至Initialied remote repo這個範例(上圖)時,
最後無法成功執行git pull origin master,顯示的原因為
"fatal: refusing to merge unrelated histories"。

我把我嘗試的步驟詳細列出來:

  • 在Github建立有Initialized repository
  • 在本地建立git repo,並建立一個版本:
    mkdir sandbox-initialized2
    cd sandbox-initialized2
    git init
    echo a > a.txt
    git add .
    git commit -m "Initial commit"
  • 告知本地repo,remote repo的位址:
    git remote add origin https://github.com/uopsfof/learnGit03_init.git
  • git push 發現沒有跟remote reposiotyr sync
    Username for 'https://github.com': uopsfof
    To https://github.com/uopsfof/learnGit03_init.git
    ! [rejected] master -> master (non-fast-forward)
    error: failed to push some refs to 'https://github.com/uopsfof/learnGit03_init.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.
  • git pull origin master 失敗:
    warning: no common commits
    remote: Counting objects: 5, done.
    remote: Compressing objects: 100% (4/4), done.
    remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
    Unpacking objects: 100% (5/5), done.
    From https://github.com/uopsfof/learnGit03_init
    • branch master -> FETCH_HEAD
    • [new branch] master -> origin/master

      fatal: refusing to merge unrelated histories

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.