git相关操作

github相关概念

image.png

这里要区分git和github
git操作是属于左半部分,github属于上面部分
git是自己本地仓库和自己远程仓库的操作
github是自己仓库和别人仓库(fork和被fork仓库)之间操作
https://github.com/812865052/learngit.git是仓库的https地址
[email protected]: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//.gitconfig or ~/.gitconfig

配置git的ssh

在用ssh之前,你需要
先生成公钥私钥,然后将公钥加入到github的setting中,按照教程配置~/yefei/.ssh/config
也可以参考中文教程
它的大概过程:
1.设置本地的ssh key,打开git bash,输入命令:
ssh-keygen -t rsa -C "[email protected]" 其中双引号中是你注册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 [email protected]
会提示,是否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 [email protected]: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 之间的差别。

本地分支版本回退的方法

如果你在本地做了错误提交,那么回退版本的方法很简单
先用下面命令找到要回退的版本的commit id:
git reflog

放弃本地修改:
git reset --hard

接着回退版本:
git reset --hard Obfafd
0bfafd就是你要回退的版本的commit id的前面几位

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

如果你的错误提交已经推送到自己的远程分支了,那么就需要回滚远程分支了。
首先要回退本地分支:
查看提交记录
git log-很详细的提交记录
git reflog-列表式的提交记录,很清晰,一目了然
如果需要恢复到某个提交记录那,可以用 git reset --head+git reflog查到的版本号
查询某个作者的提交记录
git log --author='rich.ye [email protected]'

查看某次提交的修改记录
git show 20817a72da5b74b9ada10a2caccd69c3e4a59ad5

紧接着强制推送到远程分支:
git push -f origin master
注意:本地分支回滚后,版本将落后远程分支,必须使用强制推送覆盖远程分支,否则无法推送到远程分支
如果提示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 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 [email protected]: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

版权声明:
作者:Mr李
链接:https://www.techfm.club/p/43756.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>