Git用法学习总结

1. Git基本用法

git init //在当前文件夹下创建仓库,仓库名为该文件夹名

git add . //添加当前文件夹下所有文件到暂存区

git add test.txt //将test.txt添加到暂存区

git commit -m "提交说明" //将暂存区的内容全部提交到版本库中

git status //查看当前git工作区状态

git diff test.txt //查看文件test.txt的修改信息

git push -u origin master //第一次推送master分支到远程库origin的master分支,第一次加参数u

git push origin master //将当前master分支推送到远程库origin的master上(非第一次推送)

git push origin branch //将当前branch分支推送到远程库origin的branch分支上(无论你当前是否在branch分支上)。本地与远程的分支是对应的

git rm file //在工作区中删除file,如果想在版本库中也删除file,则用命令‘git commit -a "提交说明"’ 就行了。

注: 把当前分支推送到远程库对应分支上时,可以省略分支名。

如:当前位于master分支,若要推送本地master分支到远程origin库的master,可用:git push origin即可。

再如:当前位于dev分支,若要推送本地dev分支到远程origink库的dev,可用:git push origin即可。

2. Git连接远程库

git remote -v //查看连接到的远程库

git remote add origin url //将本地库关联到远程库,远程库名命名为origin,远程库地址为url,url可以为ssh协议也可以为https协议

git remote rm origin //取消与远程库origin的关联

//将本地库同时关联到github库和码云库
git remote add github githuburl //github是远程库的命名,也可以取其他的名字,githuburl为github上的库地址
git remote add gitee giteeurl //gitee是远程库的命名,也可以取其他的名字,giteeurl为码云上的库地址

3. Git分支管理

git branch //查看当前库的所有分支

git checkout branchName //切换到分支branchName上

git checkout -b newBranch //创建并切换到newBranch上,-b表示创建并切换

git branch -d dev //删除dev分支

git branch -D dev //强制删除一个没有合并过的dev分支

git push origin --delete dev //删除远程名为dev的分支

git merge branch //将branch分支合并到当前分支,这种合并采用的是Fast-forward模式,即“快进模式”。这种模式不会生成新的commit 

git merge --no-ff -m "合并说明" branch //将branch分支合并到当前分支。“--no-ff”表示禁止快进合并模式。这种模式会生成新的commit

git push origin branch //把branch分支推送到远程库对应的远程分支上。

git push -u origin master -f//强制覆盖已有的分支(可能会丢失改动)

git checkout -b dev origin/dev //创建远程origin的dev分支到本地

git branch --set-upstream dev origin/dev //建立本地分支和远程分支的关联

1) 当远程库有某分支,而本地没有

当远程库有某分支,而本地没有,需要在本地创建与远程库对应的该分支时,可以这样:git checkout -b dev origin/dev //创建远程origin的dev分支到本地

若要推送代码还需建立管道流通信:git branch --set-upstream dev origin/dev //建立本地分支和远程分支的关联

2) 当本地有某分支,而远程库没有

当本地有某分支,而远程库没有,需要推送本地分支到远程库时,可以这样:git push github branch1 //把branch1分支推送到远程库对应的远程分支上。,这时会提示错误:

错误提示

意思很明显,没有远程库中与当前分支的管道流。使用git push --set-upstream github branch1命令,建立流管道连接即可。这时会发现远程库中也有了branch1分支。

再注: 为什么会有的是git push origin branch1而有的是git push github branch1呢?
后面就会明白,其实origin和github都只是你自己远程库的名字,默认的叫origin,根据需要可能会修改为其他名字。如,这里修改为github了。

3) 删除远程分支

示例图:
删除远程分支
其中,

git branch -a //查看当前所有分支,上图中的remotes/origin/local_dev就是远程的分支local_dev

git push --delete local_dev // 删除远程分支名为local_dev的分支

4. 版本回退

git reset --hard HEAD^ //回退到上一个commit节点版本,HEAD表示当前节点,HEAD^表示上一个commit,HEAD^^表示上上一个commit...同理类推,表示上100个commit怎么办呢?很easy~

git reset --hard 2458144 //回退到commitId为2458144的节点版本

git checkout -- file //撤销工作区里对file的修改

git reset HEAD file //撤销添加到暂存区的file,重新放回工作区

//当你不但修改工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步
//第一步用命令
git reset HEAD file,撤销添加到暂存区的file
//第二步用命令
git checkout -- file 撤销工作区里对file的修改

5. 标签管理

标签相当于给某一个节点取的名字,方便记忆和读取,本质是commit节点。

git tag //查看所有标签

git show v1.0 //查看标签v1.0的信息

git tag v1.0 //在当前commit节点上打上v1.0标签

git tag v2.1 commitId //在指定commitId节点上打上v2.1标签

git tag -a v2.0 -m "version 2.0 released" 2634564 //给commitId为2634564的节点打上v2.0标签,并添加说明"version 2.0 released"

git tag -d v1.0 //删除v1.0标签

git push origin v1.0 //推送v1.0标签到远程库origin

git push origin --tags //推送所有未推送到远程的本地标签到远程库origin

//删除远程库标签
git tag -d v1.0 //1. 先从本地库删除
git push origin :refs/tags/v1.0 //2. 再推送到远程库删除

6. Git 打印日志

git log //详细打印提交日志

git log --pretty=oneline //一行的形式打印提交日志

git log --graph //打印合并过的分支路径

git log --pretty=oneline --abbrev-commit //以简洁形式打印提交记录

git reflog //打印命令历史日志,也就是打印以前做过哪些命令操作

7. 冲突解决

1)当push到远程库的时候往往会碰到冲突错误

推送冲突错误

  • 方法一:解决办法错误日志已经说出来了,那就是使用git pull 命令。

git pull命令执行后你需要手动解决冲突。怎么手动?

就是你的本地文件与远程不同的地方,它已经标出来了,不信打开本地文件夹看看?是不是多了<<<<<<<,=======,>>>>>>>这样的标记,那就是标出来的本地和远程的不同地方。

所谓手动解决冲突,就是你自己用眼看,看这些不一样的地方,然后决定你想要保留的内容。最后再执行重新add、commit、push到远程,就不会出现冲突了。

**注:**但是git pull这个命令是从远程下载代码,自动合并到本地的,很容易出现大量的“<<<<<<<,=======,>>>>>>>”,如果你改动的多的话,简直就是噩梦,因此是不安全的。

  • 方法二:推荐使用git fetch命令,具体如下:
git fetch origin master:tmp//抓取远程代码到本地的新生成分支tmp上(这个tmp分支是自动生成的)
git diff tmp //比较master分支与tmp分支的不同
git merge tmp//最后再合并
  • 方法三:强制覆盖远程已有的分支(可能会丢失改动),但这种方法最干净利落,省事儿~
    使用命令:
git push -u origin master -f

在绑定多个远程库时会遇到
fatal: No remote repository specified. Please, specify either a URL or a remote name from which new revisions should be fetched. 的错误。这里的意思是,你需要指定从哪个远程库的哪个分支上拉取。比如,"git pull github master"从名为github的远程库的master分支上拉取。

2)合并时冲突

$ git merge dev
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

错误提示的很明确了,就是如上面的手动解决冲突就行了

3)强制拉取远程覆盖本地仓库

git fetch --all
git reset --hard origin/master
git pull origin master

这样就把本地强制与远程同步了。

8. Github与码云(Gitee)

Github不用多说了,最有名的版本控制系统远程仓库平台。而码云(Gitee)相当于中国的github吧。

那么问题来了…纠结症又犯了~到底用哪个呢?- -|||



~ haha…都可以用,可以同时用哦~

本地电脑安装一个gitbash可以连接多个仓库平台。一个本地仓库也可以对应连接多个远程仓库。

首先介绍本地Gitbash连接多个仓库平台

将本地Gitbash用户主目录的.ssh目录下的id_rsa.pub里的内容(公钥)添加到github和gitee的ssh key里,这是标识你电脑和github以及gitee的对应关系的。可以添加多个,因为你可能不止一台设备嘛~

:啥?不知道啥是用户主目录?

:打开Gitbash,用命令pwd就出来了

:啥?用户主目录下没有.ssh目录?

:你肯定第一次用吧?在Gitbash里,用命令git init新创建一个仓库就会生成.ssh目录,里面有id_rsa和id_rsa.pub两个文件,分别是私钥和公钥。

其他就不详细介绍了…

接着介绍如何将本地的一个库同时关联到github和gitee上的两个远程库

举个栗子~
我有一个本地仓库,名字叫:learngit
我想把它同时连接到我的github和码云,并且每次提交代码可以选择性的提交我想提交的平台。

  • **1.**在github和码云分别创建名为learngit的仓库
  • **2.**在本地仓库learngit文件夹下,右键–>Gitbash here…
    打开了Gitbash客户端(或者由Gitbash客户端切换目录到这个目录下也行)。

3. 接下来命令操作:

git remote -v //查看远程连接信息

答案肯定是什么都没连…,接下来要做的就是分别关联本地learngit仓库到github和码云

git remote add github githuburl //github是远程库的命名,也可以取其他的名字,githuburl为github上的库地址

git remote add gitee giteeurl //gitee是远程库的命名,也可以取其他的名字,giteeurl为码云上的库地址

关联后可以用git remote -v查看连接信息
我的效果如下:

远程库连接信息

上图说明连接到了gitee、github两个远程库,fetch、push是可用的权限,意思是可以抓取远程库数据到本地,也可以推送数据到远程库。

4.推送代码时:

git push github master //推送本地master内容到github对应的仓库中去

git push gitee master //推送本地master内容到gitee对应的仓库中去

**注:**仓库分支的推送都是对应的,本地的master分支默认推送到远程库的master分支下。想想也是,不同分支的推送就不叫推送了!那叫分支合并啦好不好~

参考文档:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

9. 其他问题

git仓库删除所有提交历史记录,成为一个干净的新仓库

1.新建一个分支

   git checkout --orphan new_branch

2. 添加所有的文件到这个分支下

   git add -A

3. 提交

   git commit -am "初始化仓库"

4. 删除原来的master分支

   git branch -D master

5.把当前分支重命名为master

   git branch -m master

6.提交到远程仓库,强制覆盖,这样就把原来的commit信息全部清除了

   git push -f origin master

文章来源:https://blog.csdn.net/yc1022/article/details/56487680

git合并commit记录,并提交到远程库

使用 git 时难免会 commit 一些无用的提交,或者重复的提交。
看着自己的 commit 记录越来越多,有些只是改了一行代码,并不是什么重大的更改,都要产生一条 commit 记录,这样就显得特别冗余。

如果能将历史提交的多条commit合并成一条该多好啊!

很荣幸告诉你,阔以哦~

我想达到的效果是

假设我们有test1、test2、test3、test4四个提交,其中 test2、test3是重复的。我想让 test2、test3合并成一个,变成这样的记录:test1、test23、test4

以下是我做的实验

我提交了四个记录,commit 信息分别是:test1、test2、test3、test4
提交的命令就不写了,能问这个问题的,肯定基本的 git命令 都会了。

查看当前提交历史,使用命令:git log --graph,以图形的形式展现 log 记录,好看吧

* commit 9555a3393039da4b64733073f6a4e9e1ec2aecf4 (HEAD -> dev2)
| Author: fanlulin <fanlulin@baidu.com>
| Date:   Fri Jul 19 19:45:34 2019 +0800
| 
|     test4
| 
* commit 43bda1e39ccc65275f2efd2da021273fbac4fa39
| Author: fanlulin <fanlulin@baidu.com>
| Date:   Fri Jul 19 19:45:19 2019 +0800
| 
|     test3
| 
* commit 5ef39c8dd736a28c2c5aa18452b5a27e21b31d99
| Author: fanlulin <fanlulin@baidu.com>
| Date:   Fri Jul 19 19:45:00 2019 +0800
| 
|     test2
| 
* commit 7b4ab2a2e8fc0c8fba21e652b07cf3ec9fc99cd7
| Author: fanlulin <fanlulin@baidu.com>
| Date:   Fri Jul 19 19:44:42 2019 +0800
| 
|     test1

然后重点来了!!!

使用命令:git rebase -i 7b4ab2a2e回到 test1(至少要回到你要编辑的前一个commit,这里我们要编辑 test2、test3,所以回到了 test1)

命令面板会变成这样:
命令面板
这就是控制合并commit的地方了。按 ‘i’ 进行编辑(是的,这就是 vim 编辑模式),修改成下面这样:
修改后

修改前:

pick 5ef39c8 test2
pick 43bda1e test3
pick 9555a33 test4

修改后:

pick 5ef39c8 test2
s 43bda1e test3
pick 9555a33 test4

改动的地方就是最上面的,将 test3前面的 pick 改成了 s

那么 pick 撒意思?s 撒意思呢?
答案是:

pick 的意思是要会执行这个 commit
s 是squash的缩写, 意思是这个 commit 会被合并到前一个commit

所以,以上改动将 test3合并到了 test2

接着,保存改动。保存会吧?就是 vim 的保存操作啦。:wq

保存完后,命令面板会变成这样:
保存后

这是让你编写这次合并的信息呢。就像我这里写的信息是:test2、test3合并到了 test23

合并信息
然后保存就结束啦!

赶快看看提交记录,是不是我要的效果,执行命令git log --graph
合并后的记录
果然啊,之前的test1、test2、test3、test4变成了test1、test23、test4

最后,如果你合并之前已经 push 到远程了怎么办?

直接git push origin dev的话会出现冲突,
在确保远程库没有被别人改动后,或者这个库就是你自己的,像我就是。
我就强行 push 覆盖远程库了。
执行:git push -f origin dev
成功将远程库的 commit 记录也变成本地这样了。

10. git pull 与 git pull -r

git pull 相当于:

  1. git fetch
  2. git merge
    这样从远程拉下来的内容会与本地自动合并,且会产生一个merge的commit记录。

而git pull -r相当于:

  1. git fetch
  2. git rebase

这样从远程拉下来的内容会与本地自动合并,但不会产生commit记录,而是先将当前的改动缓存起来,然后将远程分支的改动同步到本地,再将刚才缓存的改动放到新同步节点的后面。这就是所谓的变基(就是改变基础嘛)。

11. git cherry-pick 将指定的commitId拷贝到当前分支

命令格式:

git cherry-pick <commitHash>

比如下面两个分支

 a - b - c - d   Master
         \
           e - f - g Feature

接下来想把Feature的 f 拷贝到Master分支上,那么可以在Master分支上使用下列命令:

# 切换到 master 分支
$ git checkout master

# Cherry pick 操作
$ git cherry-pick f

执行完后,现在的分支变成了这样:

a - b - c - d - f   Master
         \
           e - f - g Feature

还可以拷贝多个commit :

$ git cherry-pick <commitId1> <commitId2>

12. git打patch

patch意为“补丁”。我们可以将改动扽内容打成patch文件,在需要的地方应用该patch文件,从而实现改动的内容迁移。

创建diff文件

如果当前的改动没有提交,可以打成patch文件保存。

// 将所有修改保存到patch文件
git diff > test.patch
// 将文件Test.java中的修改保存到patch文件
git diff Test.java > test.patch

应用patch文件

从patch文件中恢复改动

git apply test.patch

检查patch文件

上面是保存修改和恢复修改最简单的步骤。
保险起见,还可以先检查下patch文件的内容。

// 查看test.patch文件的信息
git apply --stat test.patch
// 检查test.patch文件是否能恢复,如果执行后没有输出,则说明没冲突,可以恢复。
git apply --check test.patch
// 如果发生冲突,取消应用patch文件
git am --abort

参考文章
https://blog.csdn.net/qq_21744873/article/details/82629343
https://www.jianshu.com/p/964de879904a
https://www.cnblogs.com/wangiqngpei557/p/6056624.html
http://jartto.wang/2018/12/11/git-rebase/
https://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html
git生成patch: https://blog.csdn.net/u013318019/article/details/114860407

完结撒花~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子林Android

感谢老板,老板大气!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值