從上週開始,我就下了決心,打算每週寫3篇文章在IT邦!<握拳>
(理想且不偷懶的情況啦XD)
也是為了年底鐵人賽一口氣寫30篇文章馬拉松做準備:)笨鳥趕快練習先飛
但據說,寫文章最難的部分,是找題材!
所以最近每次遇到bug或錯誤都挺興奮 開心(?) 的,因為又可以寫筆記了
也可以記錄新手學習之路上遇到的常見問題,提供其他新手參考。
最近學Udemy平台Ruby學習線上課程,我在本機練習做了一個Ruby on Rails專案(名稱定為:yelpdemo),
我先用subl .
叫出Sublime編寫專案內的網頁,做一點修改後,
再用Terminal按照我自己Day2筆記所說的Git步驟試著同步此專案到Github的同名repository儲存庫。
git status
看看目前working directory中所有檔案的情形,紅色代表這些檔案需要被追蹤:
git add .
把以上所有檔案交給Git,再輸入一次git status
,綠色代表已更改為被追蹤:
git commit
git commit -m "first commit"
,備註-m裡寫上"執行第一個提交指令commit",將staged檔案儲存到儲存庫:
然後再輸入一次git status
:
好了,到這邊都挺順的~
git remote add origin
git remote add origin https://github.com/(你的帳號)/(你的專案名稱)
:
設定遠端origin的repository路徑,然後再推送:git push -u origin master
-u是update的意思,用了參數-u之後,未來就能直接使用不帶參數的git pull
從以前push過的分支來pull。
如果你沒有先
git remote add origin
就直接git push
就會像我一開始一樣,出現了'找不到儲存庫'的問題喔!
git push -u origin master
[燈等!]更新被拒絕了,因為上週我在Remote建的的repo裡面,有些更動過的檔案版本,本地端並沒有:
[解決]提示告訴我可以先用
git pull
,
然後再
git push
一次:
重點在於最後一行:git push預設會推送「本地分支」到相同檔名的「遠端分支」
When push.default is set to 'matching', git will push local branchesto the remote branches that already exist with the same name.
[燈等!]問題再度出現:The current branch master has no upstream branch,表示當前分支主機沒有上游分支:
[解決]按照提示,依樣畫葫蘆地
git push --set-upstream origin master
[燈等!] 新的問題產生,提示說我的master是non-fast forward
這個non-fast forward 的意思是本機commit和遠端的不相同,本地和遠端的Repository發生文件衝突問題(線圖有分岔)。
由於上週在遠端創建的資料夾內容文件發生改變,因此不允許我把本地的文件覆蓋上去。
關於合併local端和remote端,近一步了解可以看git官網,或是連猴子都能懂的Git入門指南解釋
在push之前,我需要git fetch
git merge
將遠端的改變用merge合併到本地上。
或是我可以用git push -f
強制覆蓋本地文件替代git儲存庫的內容。
Google關鍵字在stackoverflow找到的解法是git push -f origin <branch>
。
-f代表force:強制推送。如果不想把遠端分支的更動合併(merge)到本地分支,則可以使用這個指令。但要小心使用。
[解決]
回到github站上檢查,終於同步完成:
===
後記:
這是寫給自己提升記憶的筆記。相信之後如果在本機再建立其他新專案、遠端建立儲存庫並使用gite功能,可能還是會遇到以上類似的問題,身為自學git新新手,我沒有直接發問求救,而是靠google增加觀念、進而找到解答,因此還蠻開心的!
看了資料,有些工程師的建議是少用git pull
,以git fetch
和git merge
代替。也許以後實作之後有類似的經驗和心得,再寫點相關的文章。
ref:
https://blog.exfast.me/2016/05/git-instructions-instructions/
https://gitbook.tw/chapters/using-git/add-to-git.html
小弟沒有用指令操作過 git 覺得蠻有趣的,分享一下研究心得。
Step5 的 git pull 其實沒有拉東西下來,是因為上一個 push 指令失敗,
沒有成功追蹤遠端 master,所以 git 不知道要 merge 哪一個遠端分支回當前分支上。
There is no tracking information for the current branch.
接著執行 git push,其實這裡的問題和上一個指令一樣,沒有追蹤遠端分支,
您的 git 版本應該是 2.0 以上,因此才會有這段錯誤訊息。
fatal: The current branch new has no upstream branch.
To push the current branch and set the remote as upstream,
use git push --set-upstream origin master
如果是舊版預設 push.default=matching 會推送所有分支,
而 2.0 以上預設 push.default=simple 如果沒有指定分支,就會出現上面的錯誤 [1]。
接著執行了 git push --set-upstream origin master,其實回到了開頭 XD。
git push -u origin master
//等於
git push --set-upstream origin master
不過怎麼訊息好像和第一段不太一樣 [2]。
fetch first
: 表示遠端的版本和本地的 origin/master 不同。non-fast forward
: 表示當前 master 和 origin/master 不同。因為 pull = fetch + merge
之前下過的 git pull 雖然失敗,但其實是出錯在 merge 的部分,fetch 已經將遠端的版本更新回 origin/master 了。
最後的 git push -f
如您所說 要小心使用
,因為如果多人開發,改變遠端分支,可能會讓其他人的 git 壞掉 XD。
阿,好晚了... 明天再繼續研究,感謝大大分享,學到很多東西。
今天又熬夜了...
[1] Git push與pull的預設行為
[2] Git “fetch first”and ”non-fast-forward“ error when trying to push
哇!感謝大大的實際操作以及回應分享(拜)這樣交流整理的真好!
*等於是另外一篇blog文章了XD *
讓我也對git fetch有更多認識,下次我不用pull,取代用fetch + merge:)
哈哈哈,我很少用其他功能,偷懶只用 push
和 pull
。
有時候想讓分支圖乾淨一點可以用。
fetch + rebase
//或
fetch + cherry-pick
因為 merge
會多一個合併節點,多人在推的時候分支圖會分出去一大堆線,
而 rebase
或 cherry-pick
則不會,
有問過朋友不過好像沒有人在意這點,所以後來就放棄這件事 XD。
話說今年的鐵人賽要開始了,不是年底喔!!! 我也一直以為是年底。