git相关操作

github相关概念

image.png

这里要区分git和github
git操作是属于左半部分,github属于上面部分
git是自己本地仓库和自己远程仓库的操作
github是自己仓库和别人仓库(fork和被fork仓库)之间操作
https://github.com/812865052/learngit.git是仓库的https地址
git@github.com:812865052/learngit.git是仓库的ssh地址

Joe和其它贡献者已经对这个项目做了一些修改,而你将在他们的修改的基础上,还要再做一些修改。在你开始之前,你最好"同步你的fork",以确保在最新的复制版本里工作。下面是你要做的:


image.png

git安装

Linux:sudo apt-get install git
其他系统安装

本地git配置

首先要在某个文件夹(空的或者已经有文件)内执行:
git init
创建了一个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。出现下面绿色框的内容,填写标题,并将自己刚才复制的密钥粘贴到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上新建一个仓库具体见下图


    image.png

本地代码和远程仓库关联

1、首先执行类似与git remote add orgin https://github.com/812865052/newstock.git
2、执行git pull --rebase origin master (解决failed to push some refs to git的办法)
3、git push origin master

已有github仓库

  • 已有github仓库,从远程仓库下载代码
    执行前面的本地新仓库配置步骤
  • 常规的本地下载、提交和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

若大批量 增、删、改文件,显然一个个添加或删除是不可取的,以下命令可快捷操作暂存区(建议练习使用,加深对以下几个命令的理解):

git add -A 暂存区与工作区保持一致(stages All)

git add . 暂存区新建文件及更改文件(stages new and modified, without deleted)

git add -u 暂存区删除文件及更改文件(stages modified and deleted, without new)

单个文件的修改记录

  1. git log filename
    可以看到fileName相关的commit记录
  2. git log -p filenam
    可以显示每次提交的diff
  3. 只看某次提交中的某个文件变化,可以直接加上fileName
    git show c5e69804bbd9725b5dece57f8cbece4a96b9f80b filename

diff查看

diff各个版本区别
工作目录 vs 暂存区
git diff filename
意义:查看文件在工作目录与暂存区的差别。如果还没 add 进暂存区,则查看文件自身修改前后的差别。
也可查看和另一分支的区别。$ git diff branch filename

暂存区 vs Git仓库
git diff --cached filename
意义:表示查看已经 add 进暂存区但是尚未 commit 的内容同最新一次 commit 时的内容的差异。
也可以指定仓库版本:git diff --cached commit filename

工作目录 vs Git仓库
git diff commit filename
意义:查看工作目录同Git仓库指定 commit 的内容的差异。
commit=HEAD 时:查看工作目录同最近一次 commit 的内容的差异。

Git仓库 vs Git仓库
git diff commit commit
意义:Git仓库任意两次 commit 之间的差别。

本地分支版本回退的方法

首先,使用 git log 命令查看提交历史,找到你想要回退的版本的提交哈希值(commit hash)或者提交消息。

运行以下命令回退到指定版本:

git reset --hard <commit>
将 <commit> 替换为你要回退到的版本的提交哈希值或者提交消息。

例如,如果要回退到提交哈希值为 abc123 的版本,命令将如下所示:

git reset --hard abc123
注意:--hard 参数将会删除回退版本后的所有更改,包括未提交的更改,请确保在执行此命令之前备份和保存你的工作。

执行回退命令后,Git 将会将当前分支指向指定的版本,并且丢弃指定版本后的所有提交。

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

在回退到指定版本后,使用 git log 命令确认你的本地仓库已经回退到了正确的版本。

如果你之前已经将本地仓库与远程仓库关联,可以直接使用以下命令将回退推送到远程仓库:

git push -f origin <branch_name>
将 <branch_name> 替换为你要推送的分支的名称。

注意:由于回退操作改变了 Git 仓库的历史记录,使用 -f 参数强制推送是必要的。请谨慎使用此命令,并确保你具有足够的权限来推送更改。

注意:本地分支回滚后,版本将落后远程分支,必须使用强制推送覆盖远程分支,否则无法推送到远程分支
如果提示GitLab: You are not allowed to force push code to a protected branch on this project.则需要在gitlab setting里面的repository里面找到protect branch,要打开允许force操作


image.png

本地同步远程仓库修改

想保留本地修改,同时把远程代码更新到本地的话,最好的命令是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的区别?

如何同步不同名字的分支
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

创建分支
git branch test

切换分支
git checkout test

创建并且切换分支
git checkout -b test
git checkout -b 本地分支名x origin/远程分支名x
使用该方式会在本地新建分支x,并自动切换到该本地分支x。
采用此种方法建立的本地分支会和远程分支建立映射关系。
然后直接git push test(新建的本地分支)

git fetch origin 远程分支名x:本地分支名x
使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checkout。
采用此种方法建立的本地分支不会和远程分支建立映射关系。

重命名分支
在当前分支执行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分支,没有和远程分支关联
第二行,本地的master分支,和远程的origin/master分支关联
第三行,本地的v4.7.0分支,和远程的gerrit/jacoco分支关联
其中,远程名字和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.

当前分支与取消和远程分支关联
git branch --unset-upstream

当前分支与和远程分支关联
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到远程自己的项目。
第二,先执行git stash,然后在执行git merge upstream/master,最后执行git stash pop,把自己的修改又展示出来。

git push 把代码上传到fork项目
最后就是在网页发起pull request请求
另外一种方法就是github网页操作,具体步骤,参考这篇文章

同步master代码到feature分支

#1 创建功能分支 
(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-切到新分支看开发代码

git fetch -这里会把所有新分支拉下来 否则在 git branch -r看不到开发新建的分支
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

就执行git clean -df remit-manager.iml
然后再执行checkout

查看冲突文件列表
git diff --name-only --diff-filter=U

【Git】pull 分支报错 fatal: Need to specify how to reconcile divergent branches

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容