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之后,他們的代碼也自動的回退了。
但是,要注意以下幾點:
- revert 是撤銷一次提交,所以后面的commit id是你需要回滾到的版本的前一次提交
- 使用revert HEAD是撤銷最近的一次提交,如果你最近一次提交是用revert命令產(chǎn)生的,那么你再執(zhí)行一次,就相當(dāng)于撤銷了上次的撤銷操作,換句話說,你連續(xù)執(zhí)行兩次revert HEAD命令,就跟沒執(zhí)行是一樣的
- 使用revert HEAD~1 表示撤銷最近2次提交,這個數(shù)字是從0開始的,如果你之前撤銷過產(chǎn)生了commi id,那么也會計算在內(nèi)的。
- 如果使用 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
- 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/


