github相關概念
這里要區(qū)分git和github
git操作是屬于左半部分皿桑,github屬于上面部分
git是自己本地倉庫和自己遠程倉庫的操作
github是自己倉庫和別人倉庫(fork和被fork倉庫)之間操作
https://github.com/812865052/learngit.git
是倉庫的https地址
git@github.com:812865052/learngit.git
是倉庫的ssh地址
Joe和其它貢獻者已經(jīng)對這個項目做了一些修改毫目,而你將在他們的修改的基礎上,還要再做一些修改诲侮。在你開始之前镀虐,你最好"同步你的fork",以確保在最新的復制版本里工作沟绪。下面是你要做的:
git安裝
Linux:sudo apt-get install git
其他系統(tǒng)安裝
本地git配置
首先要在某個文件夾(空的或者已經(jīng)有文件)內(nèi)執(zhí)行:
git init
創(chuàng)建了一個git倉庫
然后設置git屬性
git config --global user.name "yefeimac" #可以不加--global
git config --global user.email "your email address" #可以不加--global
git config --global core.sshCommand "ssh -i /Users/yefei/.ssh/id_rsa" #這里設置git使用哪個密鑰刮便,非常好用
git配置文件地址: macOS and Linux: /Users/<username>/.gitconfig or ~/.gitconfig
配置git的ssh
在用ssh之前,你需要
先生成公鑰私鑰绽慈,然后將公鑰加入到github的setting中恨旱,按照教程配置~/yefei/.ssh/config
也可以參考中文教程
它的大概過程:
1.設置本地的ssh key,打開git bash,輸入命令:
ssh-keygen -t rsa -C "XXXXXX@XXXX.com" 其中雙引號中是你注冊github時用的郵箱坝疼。
一直回車搜贤,選擇默認路徑,和空密碼裙士。最后會在默認路徑下生成.ssh文件夾入客,打開.ssh里面有兩個文件,打開id_rsa.pub復制里面的密鑰。
2.打開github,選擇settings
點擊ssh and gpg keys,選擇ssh keys 右邊的new ssh key桌硫。出現(xiàn)下面綠色框的內(nèi)容夭咬,填寫標題,并將自己剛才復制的密鑰粘貼到key中铆隘。最后點擊add ssh key.
titile隨便取名字卓舵,一般讓你自己明白是哪個電腦,比如yefeiMBP
3.查看是否成功膀钠。在git bash中輸入命令:(注意是git bash掏湾,不是win自帶的cmd中輸入命令)
ssh -T git@github.com
會提示,是否continue肿嘲,輸入yes融击。后就會看到:
Warning:Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.
Hi zhangsiyao11! You've successfully authenticated, but GitHub does not provide shell access.
這樣就成功了,不用理會warning雳窟。
同理尊浪,你的這個ssh既可以加到github上,也可以加到公司的gitlab里
新建遠程倉庫流程
-
配置GitHub倉庫
在github上新建一個倉庫具體見下圖
本地代碼和遠程倉庫關聯(lián)
1封救、首先執(zhí)行類似與git remote add orgin https://github.com/812865052/newstock.git
2拇涤、執(zhí)行git pull --rebase origin master (解決failed to push some refs to git的辦法)
3、git push origin master
已有github倉庫
- 已有github倉庫誉结,從遠程倉庫下載代碼
執(zhí)行前面的本地新倉庫配置步驟 - 常規(guī)的本地下載鹅士、提交和push
從遠程倉庫下載新的倉庫,可以使用
https git clone:
git clone https://github.com/project/repo.git
ssh git clone:
git clone git@github.com:project/repo.git
可以直接clone特定分支的代碼
git clone 分支名 地址
本地倉庫修改后惩坑,如何同步:
1掉盅、本地修改上傳:
git add 文件名
git commit -m "comment"
或者刪除文件
git rm 文件名/文件夾(前提是該文件或者文件夾在git所在目錄里面)
然后提交 git commit -m "comment"
git push origin(reposity name) master
2、本地同步遠程倉庫代碼:
git pull origin master(好像還可以用fetch旭贬,更安全怔接,可以后面研究下)
倉庫
查看遠程倉庫
git remote -v
新建倉庫
git remote add gitname https://github.com/812865052/newstock.git
本地倉庫改名
如果不想使用origin這個名字,可以用 git remote rename origin newname改名稀轨。
提交的時候,就變成了git push newname master
若大批量 增岸军、刪奋刽、改文件,顯然一個個添加或刪除是不可取的艰赞,以下命令可快捷操作暫存區(qū)(建議練習使用佣谐,加深對以下幾個命令的理解):
git add -A 暫存區(qū)與工作區(qū)保持一致(stages All)
git add . 暫存區(qū)新建文件及更改文件(stages new and modified, without deleted)
git add -u 暫存區(qū)刪除文件及更改文件(stages modified and deleted, without new)
單個文件的修改記錄
- git log filename
可以看到fileName相關的commit記錄 - git log -p filenam
可以顯示每次提交的diff - 只看某次提交中的某個文件變化,可以直接加上fileName
git show c5e69804bbd9725b5dece57f8cbece4a96b9f80b filename
diff查看
diff各個版本區(qū)別
工作目錄 vs 暫存區(qū)
git diff filename
意義:查看文件在工作目錄與暫存區(qū)的差別方妖。如果還沒 add 進暫存區(qū)狭魂,則查看文件自身修改前后的差別。
也可查看和另一分支的區(qū)別。$ git diff branch
filename
暫存區(qū) vs Git倉庫
git diff --cached filename
意義:表示查看已經(jīng) add 進暫存區(qū)但是尚未 commit 的內(nèi)容同最新一次 commit 時的內(nèi)容的差異雌澄。
也可以指定倉庫版本:git diff --cached commit
filename
工作目錄 vs Git倉庫
git diff commit
filename
意義:查看工作目錄同Git倉庫指定 commit 的內(nèi)容的差異斋泄。
commit
=HEAD 時:查看工作目錄同最近一次 commit 的內(nèi)容的差異。
Git倉庫 vs Git倉庫
git diff commit
commit
意義:Git倉庫任意兩次 commit 之間的差別镐牺。
本地分支版本回退的方法
首先炫掐,使用 git log 命令查看提交歷史,找到你想要回退的版本的提交哈希值(commit hash)或者提交消息睬涧。
運行以下命令回退到指定版本:
git reset --hard <commit>
將 <commit> 替換為你要回退到的版本的提交哈希值或者提交消息募胃。
例如,如果要回退到提交哈希值為 abc123 的版本畦浓,命令將如下所示:
git reset --hard abc123
注意:--hard 參數(shù)將會刪除回退版本后的所有更改痹束,包括未提交的更改,請確保在執(zhí)行此命令之前備份和保存你的工作讶请。
執(zhí)行回退命令后参袱,Git 將會將當前分支指向指定的版本,并且丟棄指定版本后的所有提交秽梅。
自己的遠程分支版本回退的方法
在回退到指定版本后抹蚀,使用 git log 命令確認你的本地倉庫已經(jīng)回退到了正確的版本。
如果你之前已經(jīng)將本地倉庫與遠程倉庫關聯(lián)企垦,可以直接使用以下命令將回退推送到遠程倉庫:
git push -f origin <branch_name>
將 <branch_name> 替換為你要推送的分支的名稱环壤。
注意:由于回退操作改變了 Git 倉庫的歷史記錄,使用 -f 參數(shù)強制推送是必要的钞诡。請謹慎使用此命令郑现,并確保你具有足夠的權限來推送更改。
注意:本地分支回滾后荧降,版本將落后遠程分支接箫,必須使用強制推送覆蓋遠程分支,否則無法推送到遠程分支
如果提示GitLab: You are not allowed to force push code to a protected branch on this project.則需要在gitlab setting里面的repository里面找到protect branch朵诫,要打開允許force操作
本地同步遠程倉庫修改
想保留本地修改辛友,同時把遠程代碼更新到本地的話,最好的命令是git pull --rebase剪返,只用git pull會多出很多無用的commit信息废累。詳細信息參考git pull --rebase和這篇
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase
或者是用git fetch upstream 然后git merge upstream/master 參考git pull 和 git fetch的區(qū)別?
如何同步不同名字的分支
The upstream branch of your current branch does not match
the name of your current branch. To push to the upstream branch
on the remote, use
git push gerrit HEAD:jacoco
To push to the branch of the same name on the remote, use
git push gerrit v4.7.0
分支
查看本地和遠程分支
git branch -a
查看本地分支
git branch
查看所有遠程分支
git branch -r
創(chuàng)建分支
git branch test
切換分支
git checkout test
創(chuàng)建并且切換分支
git checkout -b test
git checkout -b 本地分支名x origin/遠程分支名x
使用該方式會在本地新建分支x脱盲,并自動切換到該本地分支x月培。
采用此種方法建立的本地分支會和遠程分支建立映射關系逗堵。
然后直接git push test(新建的本地分支)
git fetch origin 遠程分支名x:本地分支名x
使用該方式會在本地新建分支x足删,但是不會自動切換到該本地分支x眨层,需要手動checkout匣距。
采用此種方法建立的本地分支不會和遠程分支建立映射關系。
重命名分支
在當前分支執(zhí)行git branch -m new-branch-name哎壳,則把當前分支重新命名為new-branch-name
必須是相同名字的分支才能push毅待,否則會報error: src refspec xxx does not match any / error: failed to push some refs to
把master代碼合到當前分支
1.切換到主分支
git checkout master
2.使用git pull把master代碼拉到本地
git pull upstream master
3.切換到自己的分支——>(XXX)
git checkout XXX
4.使用merge把主分支的代碼合并到自己的分支
git merge master
注意:合并時有可能會有沖突,解決完沖突才能push
5.最后push耳峦,你分支的代碼就和主分支的一樣了
git push origin xxx
刪除本地分支
git branch -d xxxxx
查看本地分支與遠程分支的映射關系
git branch -vv (注意是兩個v)
第一行恩静,本地的jacoco分支,沒有和遠程分支關聯(lián)
第二行蹲坷,本地的master分支驶乾,和遠程的origin/master分支關聯(lián)
第三行,本地的v4.7.0分支循签,和遠程的gerrit/jacoco分支關聯(lián)
其中级乐,遠程名字和ahead和behind的意思:
Ahead is the number of commits on this branch that do not exist on the base branch. Behind is the number of commits on the base branch that do not exist on this branch.
當前分支與取消和遠程分支關聯(lián)
git branch --unset-upstream
當前分支與和遠程分支關聯(lián)
git branch -u origin/addFile
或者使用命令:
git branch --set-upstream-to origin/addFile
fork別人項目后,先同步更新別人的提交县匠,然后把自己的代碼merge到原項目
git remote -v
git remote add upstream git@github.com:xxx/xxx.git(這里還可以填https的地址) 把原項目加入到upstream
如果填錯地址风科,想刪除upstream,用git remote rm upstream
git fetch upstream 從原項目拉取最新代碼
git merge upstream/master 將源代碼最新代碼合到fork分支
或者直接拉推特定分支代碼到當前分支
git pull upstream Financial-User
git pull origin Financial-User
git push origin Financial-User
如果上一步出錯乞旦,提示:
error: Your local changes to the following files would be overwritten by merge:
Please, commit your changes or stash them before you can merge.
有兩種解決方法贼穆,第一, 先commit本地修改兰粉,然后合并在push到遠程自己的項目故痊。
第二,先執(zhí)行git stash玖姑,然后在執(zhí)行git merge upstream/master愕秫,最后執(zhí)行git stash pop,把自己的修改又展示出來焰络。
git push 把代碼上傳到fork項目
最后就是在網(wǎng)頁發(fā)起pull request請求
另外一種方法就是github網(wǎng)頁操作戴甩,具體步驟,參考這篇文章
同步master代碼到feature分支
#1 創(chuàng)建功能分支
(master) git checkout -b feature
#2 功能迭代
(feature) git commit ...
#3 合并最新主干代碼
(feature) git checkout master
(master) git pull orgin master
(master) git checkout feature ####把feature合并到master
(feature) git merge master
gitlab常見操作
git pull upstream master 本地分支拉取最新master代碼
git branch -a
git checkout xxx
git remote -v
git pull upstream Financial-User
忽略文件設置
.gitignore
文件位置就在項目根目錄
exclude
git 還提供了另一種 exclude 的方式來完成同樣的忽略
不同的是 .gitignore 這個文件本身會push到庫中去闪彼。保存的是公共的需要排除的文件甜孤。
而exclude 是自己本地忽略的設置,不會影響到其他人备蚓,也不會提交到庫中去课蔬。
exclude 文件所在位置
項目根目錄/.git/info/exclude
場景1-切到新分支看開發(fā)代碼
git fetch -這里會把所有新分支拉下來 否則在 git branch -r看不到開發(fā)新建的分支
git check out 分支名 就自動切到新分支了 代碼也是分支代碼
如果報錯
error: The following untracked working tree files would be overwritten by checkout:
remit-manager.iml
Please move or remove them before you switch branches.
Aborting
就執(zhí)行git clean -df remit-manager.iml
然后再執(zhí)行checkout
查看沖突文件列表
git diff --name-only --diff-filter=U
【Git】pull 分支報錯 fatal: Need to specify how to reconcile divergent branches