git config pull.rebase false # merge (the default strategy)
git pull = git fetch + git merge
git config pull.rebase true # rebase
git pull = git fetch + git rebase
git pull 就不多说了,直接来看 git pull --rebase 吧。
现在,用户 A,用户 B 和 远程仓库的代码版本都是最新且保持一致的。
用户 A 在本地提交了两次 commit ,领先远程仓库 2 commit:
# User A
Administrator@PC-20200713AJJH MINGW64 /d/MyProject/Python/GitTest (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
Administrator@PC-20200713AJJH MINGW64 /d/MyProject/Python/GitTest (master)
$ git log
commit db412233fd10dbf782147ae678310ef7a412ccf4 (HEAD -> master)
Author: 2392863668 <2392863668@qq.com>
Date: Wed Jul 29 22:28:31 2020 +0800
mv test.txt to test dir
commit 32b9c4ee0b74b629e1d1e99f1d0173a831638d7c
Author: 2392863668 <2392863668@qq.com>
Date: Wed Jul 29 22:15:01 2020 +0800
delete d.txt
commit 70f19e6d0788ad7fca07b129a8615084fe08f1e9 (origin/master, origin/HEAD)
Author: 2392863668 <2392863668@qq.com>
Date: Wed Jul 29 21:58:26 2020 +0800
modify c.txt
commit 082b01177112fc3ccb93f234435fb06a930c19fb
Author: 2392863668 <2392863668@qq.com>
Date: Wed Jul 29 21:05:16 2020 +0800
add hello world in b.txt
# User B
[root@master GitTest]# git log
commit 70f19e6d0788ad7fca07b129a8615084fe08f1e9
Author: 2392863668 <2392863668@qq.com>
Date: Wed Jul 29 21:58:26 2020 +0800
modify c.txt
commit 082b01177112fc3ccb93f234435fb06a930c19fb
Author: 2392863668 <2392863668@qq.com>
Date: Wed Jul 29 21:05:16 2020 +0800
add hello world in b.txt
commit d38440866faa62ff1a2c383be1fc780bbbb859f7
Author: 2392863668 <2392863668@qq.com>
Date: Wed Jul 29 20:53:13 2020 +0800
然后 A 将提交 git push 到了远程仓库:
Administrator@PC-20200713AJJH MINGW64 /d/MyProject/Python/GitTest (master)
$ git push
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 572 bytes | 572.00 KiB/s, done.
Total 6 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 1 local object.
To github.com:2392863668/GitTest.git
70f19e6..db41223 master -> master
B 也在本地提交了一次commit:
[root@master GitTest]# vi looking.txt
[root@master GitTest]# git add looking.txt
[root@master GitTest]# git commit -m "add hello world in looking.txt"
[master 9983c69] add hello world in looking.txt
1 file changed, 1 insertion(+)
[root@master GitTest]# git log
commit 9983c69644ade74a4fa0a2fa4f7bd1c1771f39a5
Author: looking <looking@qq.com>
Date: Wed Jul 29 23:29:39 2020 +0800
add hello world in looking.txt
commit 70f19e6d0788ad7fca07b129a8615084fe08f1e9
Author: 2392863668 <2392863668@qq.com>
Date: Wed Jul 29 21:58:26 2020 +0800
modify c.txt
commit 082b01177112fc3ccb93f234435fb06a930c19fb
Author: 2392863668 <2392863668@qq.com>
Date: Wed Jul 29 21:05:16 2020 +0800
add hello world in b.txt
然后 B 也准备将提交 git push 到远程仓库:
[root@master GitTest]# git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:
git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simple
See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)
To git@github.com:2392863668/GitTest.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:2392863668/GitTest.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first merge the remote changes (e.g.,
hint: 'git pull') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
由于远程分支已经继续往前走了,所以 B 自然而然 push 失败了,而且消息也提示让先 'git pull',这时候我们的 git pull --rebase 该上场了,git pull --rebase 以后,我们查看版本日志图,发现 modify c.txt 后面的日志记录并没有像之前那样有直观的合并记录了。直接先 git pull, 再 git merge 的话则无法避免这种情况。
[root@master GitTest]# git pull --rebase
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 2), reused 6 (delta 2), pack-reused 0
Unpacking objects: 100% (6/6), done.
From github.com:2392863668/GitTest
70f19e6..db41223 master -> origin/master
First, rewinding head to replay your work on top of it...
Applying: add hello world in looking.txt
[root@master GitTest]# git log
commit 3fceb8a9bdb24500a68477d4560c33cb305b5d5f
Author: looking <looking@qq.com>
Date: Wed Jul 29 23:29:39 2020 +0800
add hello world in looking.txt
commit db412233fd10dbf782147ae678310ef7a412ccf4
Author: 2392863668 <2392863668@qq.com>
Date: Wed Jul 29 22:28:31 2020 +0800
mv test.txt to test dir
commit 32b9c4ee0b74b629e1d1e99f1d0173a831638d7c
Author: 2392863668 <2392863668@qq.com>
Date: Wed Jul 29 22:15:01 2020 +0800
delete d.txt
commit 70f19e6d0788ad7fca07b129a8615084fe08f1e9
Author: 2392863668 <2392863668@qq.com>
Date: Wed Jul 29 21:58:26 2020 +0800
[root@master GitTest]# git log --oneline --decorate --color --graph
* 3fceb8a (HEAD, master) add hello world in looking.txt
* db41223 (origin/master) mv test.txt to test dir
* 32b9c4e delete d.txt
* 70f19e6 modify c.txt
* 082b011 add hello world in b.txt
* d384408 mv a.txt to test directory
* 648e3e1 Merge branch 'dev' to 'master'
| * d2009f7 (dev) add one line in c.txt by user B again
| * 4505d98 add one line in b.txt by user B again
* | cc12a89 add one line in a.txt by user A again
然后 B 再次尝试提交 git push 到远程仓库(这次 push 成功):
[root@master GitTest]# git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:
git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simple
See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 233 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To git@github.com:2392863668/GitTest.git
db41223..3fceb8a master -> master
如果以上直接 git pull 的话,git 会直接弹出一个类似下面这种的 merge 界面(如果有冲突的话还需要处理冲突):
Administrator@PC-20200713AJJH MINGW64 /d/MyProject/Python/GitTest (master)
$ git pull
remote: Enumerating objects: 2, done.
remote: Counting objects: 100% (2/2), done.
remote: Total 2 (delta 1), reused 2 (delta 1), pack-reused 0
Unpacking objects: 100% (2/2), done.
From github.com:2392863668/GitTest
db41223..3fceb8a master -> origin/master
Merge made by the 'recursive' strategy.
looking.txt | 1 +
1 file changed, 1 insertion(+)
而且可以看到直观的合并记录了(虽然不一定是你想要的)。
整个例子讲下来,相信你已经知道 git pull --rebase 的作用了。
git pull = git fetch + git mergegit pull --rebase = git fetch + git rebasegit pull 就不多说了,直接来看 git pull --rebase 吧。现在,用户 A,用户 B 和 远程仓库的代码版本都是最新且保持一致的。用户 A 在本地提交了两次 commit ,领先远程仓库 2 commit:# User AAdministrator@PC-20200713AJJH MINGW64 /d/MyProj.
在push代码时,会提示使用git pull命令,也就是拉取远端代码,更新我们的仓库,那么为什么又要加个 --rebase命令呢?下面来说说这个问题,先从这两命令开始。
git pull = git fetch + git merge FETCH_HEAD
git pull --rebase = git fetch + git rebase FETCH_HEAD
二者的区别是,在fetch之后的操作不同,merge与rebase的不同。
1. git pull
git pull
就是你的代码落后了真实的提交很多了,而你却在这个老一点的分支,准备commit。这个时候,你想起来,要拉一下代码了。于是一拉,就被merge到了本地。
就会产生的提交
Merge branch 'master' xxxxxx
并且,git log --graph也变的不连续。
git pull --rebase
这个时候,我们就应该用上面代码替代。而且现在git新版本会推荐你默认pull带rebase。
第一次使用git时会提示,或者
git pull --rebase = git fetch + git rebase
现在有两个分支:test和master,假设远端的master的代码已经更改了(在B基础上变动:C,F),test的代码更改了要提交代码(在B基础上变动:D,E),如下图:
D---E test
A---B---C---F--- master
问题就来了,如果C,F和D,E的更改发生冲突,那么就需要我们合并冲突了,下面我们
Hint: You have divergent branches and need to specify how to reconcile them.
Hint: You can do so by running one of the following commands sometime before
Hint: your next pull:
Hint:
Hint: git config pull.rebase false # merge
Hint: git config pull.reb
关于git分支的管理,近期在大佬的推荐下,从之前的merge更换到了rebase,因为个人也是刚使用,不太熟悉所以闹了不少笑话。简单记录分享一下个人使用rebase遇到的一些问题。
1,为什么使用rebase?
大概是因为rebase可以保持graph的整洁和干净,具体不展开,可以参考文章使用 git rebase 编写清晰的提交记录 - 掘金
2,如何设置或使用?
全局设置pull使用rebase可以通过命令行设置:
git config --global --add pull.rebase
You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.
4 git branch --set-upsteam-to=origin/远程分支名称 本地分支名称
// 此时 ,本地有了新的分支,远程也有了新的分支,但是当我执行 git pull 时,发生了问题:
5 git pull
% git pull
hint: Pulling wit
git init
Turn an existing directory into a git repository
git clone https://github.com/CodeChefVIT/git-cheatsheet.git
Replace url with your required repository url
设置用户名和emailId
git config --global user.name " FIRST_NAME LAST_NAME "
git config --global user.email " MY_NAME@example.com "
推送到存储库
git status
git push 提交到master是分支
git config --global -l 查看是否设置用户签名成功
git config --global user.name '用户名' 设置用户名
git config --global user.email '邮箱' 设置邮箱
自购买、自扫描、带书签,品质保证 第 1 章:入门篇 1.1 什么是 Git?为什么要学习它? 1.2 与其它版本控制系统的差异第2 章:环境安装2.1 安装在Windows 作业系统2.2 安装在Mac OSX 作业系统2.3 安装在Linux 作业系统2.4 图形化介面工具第3 章:终端机/ 命令提示字元3.1终端机及常用指令介绍3.2 超简明Vim 操作介绍第4 章:设定Git 4.1 使用者设定4.2 其它方便的设定第5 章:开始使用Git 5.1 新增、初始Repository 5.2 把档案交给Git 控管5.3 工作区、暂存区与储存库5.4 检视纪录5.5 状况题如何在Git 里删除档案或变更档名? 5.6 状况题 修改 Commit 纪录 5.7 状况题 追加档案到最近一次的 Commit 5.8 状况题 新增目录? 5.9 状况题 有些档案我不想放在 Git 里面... 5.10 状况题 检视特定档案的 Commit 纪录 5.11 状况题 等等,这行程式谁写的? 5.12 状况题 啊!不小心把档案或目录删掉了⋯ 5.13 状况题 刚才的 Commit 后悔了,想要 拆掉重做⋯ 5.14 状况题 不小心使用 hard 模式 Reset 了某个 Commit,救得回来吗? 5.15 冷知识 HEAD 是什么东西? 5.16 状况题 可以只 Commit 一个档案的部份的内容吗? 5.17 冷知识 那个长得很像乱码 SHA-1 是怎么算出来的? 5.18 超冷知识 在. git 目录里有什么东西? Part 1 5.19 超冷知识 在. git 目录里有什么东西? Part 2 第 6 章:使用分支 6.1 为什么要使用分支? 6.2 开始使用分支 6.3 对分支的误解 6.4 合并分支 6.5 状况题 为什么我的分支都没有「小耳朵」? 6.6 常见问题合并过的分支要留着吗? 6.7 状况题 不小心把还没合并的分支砍掉了,救得回来吗? 6.8 另一种合并方式(使用 rebase) 6.9 合并发生冲突了,怎么办? 6.10 冷知识 为什么大家都说在 Git 开分支「很便宜」? 6.11 冷知识 Git 怎么知道现在是在哪一个分支? 6.12 状况题 我可以从过去的某个 Commit 再长一个新的分支出来吗?第7 章:修改历史纪录7.1 状况题修改历史讯息7.2 状况题把多个Commit 合并成一个Commit 7.3 状况题把一个Commit 拆解成多个Commit 7.4 状况题想要在某些Commit 之间再加新的Commit 7.5 状况题想要删除某几个Commit 或是调整Commit 的顺序7.6 Reset、Revert 跟Rebase 指令有什么差别?第 8 章:标签 8.1 使用标签 8.2 冷知识 标签跟分支有什么不一样?第9 章:其它常见状况题与冷知识9.1 状况题手边的工作做到一半,临时要切换到别的任务9.2 状况题不小心把帐号密码放在Git 里了,想把它删掉⋯ 9.3 冷知识怎么样把档案真正的从Git 里移掉? 9.4 冷知识 你知道 Git 有资源回收机制吗? 9.5 冷知识 断头(detached HEAD)是怎么一回事?第 10 章:远端共同协作 - 使用 GitHub 10.1 GitHub 是什么? 10.2 Push 上传到 GitHub 10.3 Pull 下载更新 10.4 状况题 怎么有时候推不上去... 10.5 从伺服器上取得 Repository 10.6 常见问题 Clone 跟 Pull 指令有什么不一样? 10.7 与其它开发者的互动 - 使用 Pull Request(PR) 10.8 状况题 怎么跟上当初 fork 专案的进度? 10.9 状况题 怎么删除远端的分支? 10.10 状况题 听说 git push -f 这个指令很可怕,什么情况可以使用它呢? 10.11 使用 GitHub 免费制作个人网站 10.12 冷知识 一定要有 GitHub 才能得到别人更新的档案吗?第 11 章:使用 Git flow 11.1 Git Flow 是什么?为什么需要这种东西?