# git 解惑 https://zlargon.gitbooks.io/git-tutorial/content/remote/upstream.html 面試題 必看 https://gitbook.tw/interview 先 commit 再 pull 再 push 的情況就是為了應對多人合併開發的情況, 如何使用 Git Push 指令只 Push 部份的進度 https://www.youtube.com/watch?v=VShhhq_5sMc 咦?這個問題是從什麼時候就有的?(從版本裡找錯誤的版本,強點才會用到) https://www.youtube.com/watch?v=Bp6nHFbP2Uc 拆commit https://www.youtube.com/watch?v=6Y6JQZAchnQ ## github pages ![](https://i.imgur.com/spTX3MT.png) ## 不需要上傳的 https://igouist.github.io/post/2021/04/newbie-1-hello-git/#%E5%8A%A0%E5%85%A5-gitignore-%E5%BF%BD%E7%95%A5%E6%AA%94%E6%A1%88 ## develop動到處理 穿越要hard develop一定不會有衝突 所以 如果有衝突帶表我有commit develop一樣怎辦 簡單用 git fetch git rest --hard origin/develop ## gitigonre 可以很多個 ![](https://i.imgur.com/wMzwgFw.png) ## 同步到最新 用fetch 在 rebase 因為fetch才會有origin/develop 你用pull沒屁用 他直接幫你merge了阿 記住有commit的分支不要pull了 ## git rebase退出 不要用reset rebase的情況用reset沒用 因為你如果合併很多檔案 這reset是退一個commit 不會退出rebase 網路的是一個合併 所以reset才能退出 要退出用 --about ## merge跟 rebase merge: 優點:記錄了真實的commit情況,包括每個分支的詳情。 缺點:因為每次merge會自動產生一個merge commit,所以在使用一些git 的GUI tools,特別是commit比較頻繁時,看到分支很雜亂。 rebase: 優點:如果我們今天在master分支不斷變化,而我其他分支要去進行同步,但如果用merge就會不斷產生merge commit,所以利用rebase可以得到更簡潔的專案歷史,去掉了merge commit。 缺點:如果今天有很多人在寫同個分支,如果因為rebase造成歷史的改變,會影響到每個人分支的使用,合併出現程式碼問題不容易定位,因為re-write了history,所以基本上不會對master做rebase。 通常我們會基於fork或其他分支進行開發,而不會直接用master進行開發,否則master會很亂,基於分支,大家相互review,降低錯誤,最後在merge到master,提高質量。 團隊上用rebase merge是回主要分之 所以不會用到 pr會幫你做 ## reset rebase要記住的 rebase 不比一般的 merge,如果直接使用 git reset HEAD^ --hard 是不會達到你想要的效果的 。有個比較簡單的方式,是可以透過 ORIG_HEAD 這個紀錄點切回 rebase 之前的狀態: `$ git reset ORIG_HEAD --hard` 這個 ORIG_HEAD 會記錄最近危險操作(例如 reset、rebase、merge 等操作)之前的紀錄點,但只會記錄最後一次。所以萬一不小心被洗掉的話,可以再去翻一下 git reflog,應該也是可以找得到 rebase 之前的 commit 的 SHA1 值,然後再執行這個指令: `$ git reset REBASE前的SHA1值 --hard` 就可以取消剛剛這次的 rebase 了。 ## reset觀念 Reset 這個英文單字的翻譯是「重新設定」,但事實上 Git 的 Reset 指令用中文來說比較像是「前往」或「變成」,也就是「go to」或「become」的概念 `$ git reset HEAD~2` 這個指令你原本可能會解讀成「請幫我拆掉最後兩次的 Commit」,但其實用「拆」這個動詞只是我們比較容易理解而已,事實上並沒有真的把這個 Commit「拆掉」(放心,所有的 Commit 都還在)。 正確的說,上面這個指令應該要解讀成「我要前往兩個 Commit 之前的狀態」或是「我要變成兩個 Commit 之前的狀態」,而隨著使用不同的參數模式,原本的這些檔案就會丟去不同的區域。 因為實際上` git reset` 指令也並不是真的刪除或是重新設定 Commit,只是「前往」到指定的 Commit,那些看起來好像不見的東西只是暫時看不到,但隨時都可以再撿回來。 ## head "HEAD",HEAD 是一個 reference,它是指向目前所 checkout 的 commit,基本上,其實就是你目前所在的 commit。 在 commit tree 中,HEAD 總是指向最近的一次commit。大部份 git 的指令如果要修改 commit tree 的狀態的話,都會先改變 HEAD 所指向的 commit。 HEAD 通常指向一個 branch 的名稱(比如 bugFix)。當你 commit 的時候,改變了 bugFix 的狀態,這一個變化可以從 HEAD 的改變中看到。 一般指向當前的分支 也可以轉指向commit ^ 一步 ^^兩步(遇到分剎用這個 可以用 1 2選擇路線) ~4 往後四步 ## HEAD要不要加^ add退回用 git reset HEAD commit退回用 git commit HEAD^ 為什麼 你可用UI介面看 只有commit才算一個動作 ## 基本解思 git clone vs git fetch vs git pull **git clone** clone 指令會把線上的專案,「整個」複製一份到你的電腦裡,並且在你的電腦裡建立相對應的標案及目錄(包括 .git 目錄),通常這個指令只會在一開始的時候使用,clone 之後要再更新的話,通常是執行 git fetch 或 git pull 指令。 這邊要用 url 但也可以用 remote 少打 但沒屁用 最好的方法 使用 github desktop **git fetch** 假設遠端節點叫做 origin,當執行 git fetch 指令的時候,Git 會比對本機與遠端(在這邊就是 origin)專案的差別,會「下載 origin 上面有但我本機目前還沒有」的內容下來,並且在本地端形成相對應的分支。 不過,fetch 指令只做下載,並不會進行合併。 **執行 fetch,可以取得遠端數據庫的最新歷史記錄。取得的提交會導入在自動建立的分支中,並可以切換這個名為 FETCH_HEAD 的分支。** 要去master 用pull 再回來 merge感覺好麻煩 **git pull** pull 指令其實做的事情跟 fetch 是一樣的,差別只在於 fetch 只有把檔案抓下來,但 pull 不只抓下來,還會順便進行合併。也就是說,本質上,git pull 其實就等於 git fetch 加上 merge 指令。 推薦用 fetch +merge(但我喜歡pull) https://stackoverflow.com/questions/292357/what-is-the-difference-between-git-pull-and-git-fetch ** git pull fetch 加上 --all才會全部** ## 將分支與主線同步的方法 https://cythilya.github.io/2018/06/19/git-merge-branch-into-master/ origin master 代表着两个概念,前面的 origin 代表远程名,后面的 master 代表远程分支名。 origin/master 只代表一个概念,即远程分支名,是从远程拉取代码后在本地建立的一份拷贝(因此也有人把它叫作本地分支)。 **git pull** ``` $ git checkout <new_branch> $ git pull origin master ``` **git fetch + git merge** ``` $ git fetch origin master $ git checkout master $ git merge origin/master $ git checkout <new_branch> $ git merge master ``` 以下是更簡單的作法,不更新本地 master 分支,直接與本地分支 origin/master 合併。 ``` $ git fetch origin master $ git merge origin/master ``` ## 問:git push origin master 這個指令是在做些什麼事? 這個指令會把你手邊的 master 分支的內容,推一份到 origin 這個地方(可能是 GitHub、GitLab 或是公司內部的 Git 伺服器),並且在 origin 這個地方形成一個同名的 master 分支。 但很多人不知道的是,其實 push 指令的完整型態長這樣: `$ git push origin master:master` 意思就是「把本地的 master 分支的內容,推一份到 origin 上,並且在 origin 上建立一個 master 分支」,所以如果把指令調整成這樣: `$ git push origin master:cat` 意思就會變成「把本地的 master 分支的內容,推一份到 origin 上,並且在 origin 上建立一個 cat 分支」。 ## HEAD、master 与 branch https://www.jianshu.com/p/4219b6f62ce3 ## 分支推上去 正常分支push到遠端 遠端 這按鈕發布 pr ![](https://i.imgur.com/2mo5Hka.png) ## 直接在devolop做開發怎辦 https://getyii.com/topic/240 ## index的作法. 用分業的方式,然後傳入request 這樣做keyword的時候,就可以直接把get傳入 ``` public function index(FAQIndexRequest $request) { $faqs = $this->service->getPaginateModels($request); $faqs->loadMissing(['category']); $routeResourceName = $this->routeResourceName; $categories = $this->service->getCategoriesOptions(); return view('admin.faqs.index', compact('faqs', 'routeResourceName', 'categories')); } ``` ## 忘記開分支了 https://www.youtube.com/watch?v=eN8weZybfS0 還沒add 沒差 因為還沒commit 有 add 也沒差 因為還沒commit commit了 用git reset HEAD 最常用到 第二招 觀念很好用法 撕貼紙 看影片就懂了 第三招 直接改名字 ###### tags: `git`