Github使用

1. 普通玩法

git remote add origin https://github.com/username/repo-name.git
git pull  
寫代碼 
git pull 
git add *  或者git add -A(可以add .gitignore)
git commit -m “/////” 
git merge 
確認沒有沖突 
git push origin master 

1.1 普通玩法 java eclipse增強版

新建一個project
cd到project的src文件夾下,
git init
git remote add origin https://github.com/username/xxxx.git
git pull origin master
進入eclipse F5刷新project

如果run .java出現(xiàn)editor does not contain a main type錯誤,eclipse中右鍵src文件夾,src 路徑右鍵 -> Build Path -> Use as Source Folder,錯誤fix

source: https://blog.csdn.net/github_35160620/article/details/52157912

2. 怎么刪除github里的文件夾

  • 如果此文件夾已被加入git追蹤,那么刪除方法很簡單,只需要將此文件夾刪掉,然后提交一下就可以了

  • 如果次文件夾曾經(jīng)被加入過git追蹤,現(xiàn)在被加入.gitignore里了,但是github上還有此文件夾。
    對于這種情況,稍微有點復(fù)雜,因為已經(jīng)加入.gitignore的文件或文件夾,無法對其進行提交了,哪怕是將其刪除,都無法提交。
    我們用以下方法可以很好的解決這個問題:

git rm -r --cached some-directory 
git commit -m 'Remove the now ignored directory "some-directory"' 
git push origin master 

3. 怎么刪除sensitive data

不留痕跡的刪除(刪掉提交sensitive data的對應(yīng)commit)

3.1 從你的資料庫中清除文件

以Windows下為例(Linux類似), 打開項目的Git Bash,使用命令:

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch path-to-your-remove-file' --prune-empty --tag-name-filter cat -- --all

其中, path-to-your-remove-file 就是你要刪除的文件的相對路徑(相對于git倉庫的跟目錄), 替換成你要刪除的文件即可.

如果你要刪除的文件很多, 可以寫進一個.sh文件批量執(zhí)行, 如果文件或路徑里有中文, 由于MinGW或CygWin對中文路徑設(shè)置比較麻煩, 你可以使用通配符號, 例如: sound/music_.mp3, 這樣就把sound目錄下以music_開頭的mp3文件都刪除了.

如果你看到類似下面這樣的, 就說明刪除成功了:

//Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (266/266)
//# Ref 'refs/heads/master' was rewritten
如果顯示 xxxxx unchanged, 說明repo里沒有找到該文件, 請檢查路徑和文件名是否正確.

注意: 補充一點, 如果你想以后也不會再上傳這個文件或文件夾, 請把這個文件或文件夾添加到.gitignore文件里, 然后再push你的repo.

3.2 推送我們修改后的repo

以強制覆蓋的方式推送你的repo, 命令如下:

git push origin master --force

這個過程其實是重新上傳我們的repo, 比較耗時, 雖然跟刪掉重新建一個repo有些類似, 但是好處是保留了原有的更新記錄, 所以還是有些不同的. 如果你實在不在意這些更新記錄, 也可以刪掉重建, 兩者也差不太多, 也許后者還更直觀些.

執(zhí)行結(jié)果類似下面:

Counting objects: 4669, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4352/4352), done.
Writing objects: 100% (4666/4666), 35.16 MiB | 51 KiB/s, done.
Total 4666 (delta 1361), reused 0 (delta 0)
To https://github.com/defunkt/github-gem.git
 + beb839d...81f21f3 master -> master (forced update)

3.3 清理和回收空間

雖然上面我們已經(jīng)刪除了文件, 但是我們的repo里面仍然保留了這些objects, 等待垃圾回收(GC), 所以我們要用命令徹底清除它, 并收回空間.
命令如下:

rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

參考資料:
https://rtyley.github.io/bfg-repo-cleaner/
http://blog.csdn.net/u013749540/article/details/70160537

4. 版本回退

4.1本地(未提交)版本回退

git reflog 或者是git log //了解一下需要回退的版本號
git reset --hard Obfafd //回退

0bfafd就是你要回退的版本的commit id的前面幾位

4.2 自己的遠程分支版本回退的方法

首先要回退本地分支:

git reflog
git reset --hard Obfafd

緊接著強制推送到遠程分支:

git push -f

注意:本地分支回滾后,版本將落后遠程分支,必須使用強制推送覆蓋遠程分支,否則無法推送到遠程分支

4.3公共遠程分支版本回退的方法

git revert HEAD                     //撤銷最近一次提交
git revert HEAD~1                   //撤銷上上次的提交,注意:數(shù)字從0開始
git revert 0ffaacc                  //撤銷0ffaacc這次提交

git revert 命令意思是撤銷某次提交。它會產(chǎn)生一個新的提交,雖然代碼回退了,但是版本依然是向前的,所以,當(dāng)你用revert回退之后,所有人pull之后,他們的代碼也自動的回退了。
但是,要注意以下幾點:

  1. revert 是撤銷一次提交,所以后面的commit id是你需要回滾到的版本的前一次提交
  2. 使用revert HEAD是撤銷最近的一次提交,如果你最近一次提交是用revert命令產(chǎn)生的,那么你再執(zhí)行一次,就相當(dāng)于撤銷了上次的撤銷操作,換句話說,你連續(xù)執(zhí)行兩次revert HEAD命令,就跟沒執(zhí)行是一樣的
  3. 使用revert HEAD~1 表示撤銷最近2次提交,這個數(shù)字是從0開始的,如果你之前撤銷過產(chǎn)生了commi id,那么也會計算在內(nèi)的。
  4. 如果使用 revert 撤銷的不是最近一次提交,那么一定會有代碼沖突,需要你合并代碼,合并代碼只需要把當(dāng)前的代碼全部去掉,保留之前版本的代碼就可以了.
  • git revert 命令的好處就是不會丟掉別人的提交,即使你撤銷后覆蓋了別人的提交,他更新代碼后,可以在本地用 reset 向前回滾,找到自己的代碼,然后拉一下分支,再回來合并上去就可以找回被你覆蓋的提交了。

4.3.1 revert 合并代碼,解決沖突

使用revert命令,如果不是撤銷的最近一次提交,那么一定會有沖突,如下所示:

<<<<<<< HEAD
全部清空
第一次提交
=======
全部清空
>>>>>>> parent of c24cde7... 全部清空

解決沖突很簡單,因為我們只想回到某次提交,因此需要把當(dāng)前最新的代碼去掉即可,也就是HEAD標(biāo)記的代碼:

<<<<<<< HEAD
全部清空
第一次提交
=======

5. fork別人的項目

5.1本地修改,再push看效果

fork別人的項目是在網(wǎng)頁上點fork,自己的github上就會同步一份一樣的倉庫代碼,想要修改就直接clone自己github上的fork的版本到本機之后,修改之后上傳

clone 倉庫地址
修改代碼
git push origin master

如果要push到被fork的原倉庫,就要原倉庫的主人同意你的pull request才能push 成功

5.2 fork后如何同步源倉庫的新更新內(nèi)容

5.2.1 給fork配置遠程庫

//查看遠程狀態(tài)
git remote -v 
//添加一個將被同步給 fork 遠程的上游倉庫
git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
//再次查看狀態(tài)確認是否配置成功
git remote -v
# origin    https://github.com/YOUR_USERNAME/YOUR_FORK.git (fetch)
# origin    https://github.com/YOUR_USERNAME/YOUR_FORK.git (push)
# upstream  https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (fetch)
# upstream  https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git (push)

5.2.2 同步fork

  • 從上游倉庫 fetch 分支和提交點,傳送到本地,并會被存儲在一個本地分支 upstream/master
git fetch upstream
  • 切換到本地主分支(如果不在的話)
git checkout master
  • 把 upstream/master 分支合并到本地 master 上,這樣就完成了同步,并且不會丟掉本地修改的內(nèi)容。
git merge upstream/master
  • 如果想更新到 GitHub 的 fork 上,直接
git push origin master

6. 分支操作

常規(guī)操作:切換分支

git checkout <branch>

6.1 Git 如何 clone 非 master 分支的代碼

我們每次使用命令git clone git@gitlab.xxx.com:xxxxx.git 默認 clone 的是這個倉庫的 master 分支。如果最新的代碼不在 master 分支上,該如何拿到呢?最新的代碼可能在daily/1.4.1分支上,我們希望拿到這個分支上的代碼。

  • 直接查看所有分支:
git branch -a #查看所有分支
//會得到
origin/HEAD -> origin/master
origin/daily/1.2.2
origin/daily/1.3.0
origin/daily/1.4.1
origin/develop
origin/feature/daily-1.0.0
origin/master
  • 然后直接
git checkout origin/daily/1.4.1

就切換好了

6.2. git創(chuàng)建新分支并push到遠程分支

git checkout -b gh-pages 
git add *
git commit -m "first post"
//git remote add origin https://github.com/username/jekyll_demo.git
git push origin gh-pages

創(chuàng)建遠程分支(本地分支push到遠程):

$ git push origin [name]

git checkout -b iss53 一行等于下面兩行

$ git branch iss53
$ git checkout iss53

6.3 刪除分支

git branch -d <branchname>

7. stash - 保存和恢復(fù)工作進度

  • git stash

    保存當(dāng)前的工作進度。會分別對暫存區(qū)和工作區(qū)的狀態(tài)進行保存

  • git stash save "message..."

    這條命令實際上是第一條 git stash 命令的完整版

  • git stash list

    顯示進度列表。此命令顯然暗示了git stash 可以多次保存工作進度,并用在恢復(fù)時候進行選擇

  • git stash pop [--index] [<stash>]

    如果不使用任何參數(shù),會恢復(fù)最新保存的工作進度,并將恢復(fù)的工作進度從存儲的工作進度列表中清除。

    如果提供<stash>參數(shù)(來自 git stash list 顯示的列表),則從該 <stash> 中恢復(fù)?;謴?fù)完畢也將從進度列表中刪除 <stash>

    選項--index 除了恢復(fù)工作區(qū)的文件外,還嘗試恢復(fù)暫存區(qū)。

  • git stash apply [--index] [<stash>]

    除了不刪除恢復(fù)的進度之外,其余和 git stash pop 命令一樣

  • git stash clear

    刪除所有存儲的進度

7. 團隊協(xié)作模式下,出現(xiàn)conflicts

7.1

7.1.1當(dāng)多成員修改不同文件

直接git pull

7.1.2 當(dāng)多成員修改文件名和文件內(nèi)容

  • 常規(guī)操作:
那么一般先 
git pull
再修改代碼 
git add
git commit
git push -u origin <branchname>
  • irregular operation: 手動合并
    git pull 之后提示,自動merge失敗



    git status 一下可以知道當(dāng)前branch已經(jīng)和origin/master 分叉了



    那么怎么辦:
  • 方法1:
    git mergetool


  • 方法2:
    用vs code 打開當(dāng)前文件夾,用其中的版本管理工具來解決conflicts 問題,要注意其中有冗余代碼的情況,然后再 git add, git commit , git push -u origin <branchname>
  • 方法3:
git checkout featurebranch
git rebase master

它會把整個 feature 分支移動到 master 分支的后面,有效地把所有 master 分支上新的提交并入過來。但是,rebase 為原分支上每一個提交創(chuàng)建一個新的提交,重寫了項目歷史,并且不會帶來合并提交。

source:
https://blog.csdn.net/u012150179/article/details/14047183
http://www.cnblogs.com/sinojelly/archive/2011/08/07/2130172.html
http://www.itdecent.cn/p/cca69cb695a6

  1. how to commit to remote branch without merge commit
git pull origin master (but no merge commit)

1. git pull --rebase

2. mannually merge commits

3. git rebase --continue

source:
http://kernowsoul.com/blog/2012/06/20/4-ways-to-avoid-merge-commits-in-git/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容