目录
🎉欢迎踏入Git的奇妙魔法世界,一场穿梭于代码海洋中的奇幻旅程即将启程!🧚♂️想象一下,你手中握着的不仅仅是一个版本控制系统的钥匙,而是通往无限创意与完美协作的神奇门扉!🌟
在这里,每一次commit都是一颗璀璨的星辰,在浩瀚的代码宇宙中留下你的智慧轨迹。🌌而branch,则是你的秘密花园,让你在不受干扰的天地里自由探索、大胆尝试,即使偶尔迷路,merge总能温柔地带你回归主路,拥抱变化,共同成长。🌱
别担心,即使你是编程界的小萌新,Git也会用它那温暖而强大的怀抱,一步步引导你学会时间旅行,轻松穿梭于代码的过去与未来,修复错误,优化创意,让每一段代码故事都闪耀着智慧的光芒。✨
所以,让我们携手Git,开启这场既严谨又充满乐趣的冒险吧!🚀准备好了吗?让我们一起,在代码的奇妙王国里,编织属于自己的精彩篇章!✍️
git基础指令
git add
**add操作后,.git生成暂存区index。 **
git log
可以让我们查看commit history,也会打印出commit id,方便我们调整版本。
HEAD
HEAD是一个指针,指向master。
** master里保存我们最新一次提交的git对象。**
-p:更漂亮地打印 。
上面打印了新提交的信息。
git status
git status 用来打印上一次提交之后,现在未提交的暂存区更改。
提交到暂存区之后,再次调用:
git diff
打印暂存区相对工作区的更改。
git reset
可以通过commit id实现回退和撤销回退。
git reset之后,git log只能查询出当前提交之前的修改。
那如果找不到之前的记录,该怎么回退呢?
git reflog
使用git reflog可以打印出本地的每一次提交记录。
git checkout --fllename
这个命令用于将文件
filename
恢复到它在最近一次提交时的状态,即撤销对该文件的本地修改。
HEAD代表当前版本,^代表回退的版本深度。一个^就是上一个版本。
下面两个操作是等价的,都是在工作区,暂存区提交修改,第二个一步到位 。
git rm
与上面在工作区删除文件,再commit等价,一步到位直接在暂存区删除。
git branch
git branch 用于查看、创建、删除分支、重命名分支,通过不同的命令参数实现相应的功能
默认只列出本地分支,不显示远程分支,并且在当前分支前面使用 * 标记
git branch -r
-r,--remotes: 只列出远程分支,本地分支不会显示
git branch -a
-a,--all: 查看所有分支,包含本地分支和远程分支
git branch -v
-v,--verbose: 查看本地分支及其对应的提交记录
git branch创建分支
以当前分支为起点,创建一个 dev 分支,使用前提是当前分支已有提交记录。
如图,本地有两个分支。
当前分支位置。
本地分支存储位置。
git checkout dev
切换分支
如图,分支由master切换到dev。
我们在开发不同的功能时,会创建不同的分支,如下图,分支上的修改互不影响。
git merge
在开发完想要的功能后,使用git merge合并分支。
如图,添加的aaa也同步到了master分支。
和dev分支的commit id相等。
merge冲突的情况
当两个分支对同一个文件的同一行进行了不同的修改时,Git 无法自动确定应该保留哪个版本的更改。这种情况下,Git 会标记一个合并冲突,并等待用户手动解决。
下图就是一个冲突的例子。
手动解决冲突之后再次提交:
当你在一个分支上进行了更改但尚未提交时,如果尝试切换到另一个分支,Git 可能会提示你保存或暂存这些更改。如果你选择不保存或暂存,并且直接切换到
master
分支,那么这些未提交的更改可能会以某种方式影响
master
分支。
所以在切换分支之前,最好确保你已经提交了所有更改,或者使用
git stash
命令暂存未提交的更改。
git stash
stash的内容存储在图中位置。
git stash list
用于列出所有存储(stashed)的更改
git merge --no-ff -m "merge fix_bug" fix
- **
--no-ff
**代表“不要快进合并”(no fast-forward merge)。通常,当合并一个分支到另一个分支时,如果合并分支(在这个例子中是fix
)自上一次从目标分支(假设你当前在master
)分离以来没有进行过其他合并,Git 会执行一个快进合并(fast-forward merge)。这意味着 Git 会简单地将目标分支的指针向前移动到合并分支的最新提交,而不是创建一个新的合并提交。使用--no-ff
选项会强制 Git 创建一个新的合并提交,即使可以进行快进合并。这样做的好处是保留了分支的历史信息,使得我们可以清楚地看到哪些更改是在哪个分支上进行的。 - **
-m "merge fix_bug"
**:这个选项允许为合并提交指定一个消息。-m
后面跟着的是要设置的提交消息,在这个例子中是"merge fix_bug"
。这有助于我们查看提交历史时快速了解合并的目的和内容。 - **
fix
**:这是要合并到当前分支的分支名称。在这个例子中,fix
分支的更改将被合并到当前所在的分支中。
git commit
将暂存区内容提交到版本库, 进入 vi 命令界面输入提交信息
git commit
将某些已被跟踪的文件提交到版本库(包含工作区和版本库)
git commit [file1] [file2] [...]
将暂存区内容提交到版本库, 无需进入 vi 命令界面输入提交信息
git commit -m [message]
跳过 git add, 将所有已被跟踪的文件更改提交到版本库
git commit -am [message]
使用一次新的commit, 替代上一次提交
如果代码没有任何新变化, 则用来改写上一次commit的提交信息
git commit --amend -m [message]
git commit -D
对于已经commit过的分支,-D强行删除。
git remote
git remote本质上是用来管理远端仓库列表的命令,这些远端仓库的信息都被保存在./git/config 文件中。
git remote -v
显示所有远程仓库。
git clone
将远程仓库的内容拷贝到本地,不能在本地仓库目录里克隆。
git push origin master:master
origin :远程,即向远程推送
master :将本地的master分支推送到远程。
:master :远程的master分支,即目的地,可省略,等价为git push origin master。
当本地分支和远程分支关联,即可直接git push。
git pull origin master
从远程仓库拉取新版本的代码,当本地分支和远程分支关联,即可直接git pull
alias
起别名
使用alias,例如给status起别名为st。
git config --global alias.st status
tag
默认给最新的提交打标签。
标签存储在下图位置。
也可通过commit id给指定提交打标签。
git tag -d
推送标签
git show
查看标签
多人协作实例
**实现方法 **
为了模拟多人协作,我使用Linux的git和本机windows 的powershell中的git作为两个用户。
master是稳定分支,我们一般不在master分支上开发。
在远程创建dev分支,然后拉取,查看。
图解
在任意文件夹中shift+右键 ,打开Powershell,clone远程仓库。
当前开发者关系
打印分支
创建分支
可以看到,本地没有dev分支,那就创建一个出来。
本地dev分支和远程dev分支建立连接。
修改并push之后,查看分支
新增加的bbb成功上传。
转到powershell,查看分支。
故技重施,关联分支。
修改file.txt。
果不其然,发生冲突。
解决冲突
冲突原因
这是因为我们本地仓库和远程仓库的修改在同一行,git不知道保留哪个。
拉取仓库 ,手动解决冲突
先拉取远程仓库。
本地文件变成下面这样,这是冲突了。
手动改成我们想要的结果。
再次push,成功。
dev分支已经修改完毕,但是master分支还没有。
同步master分支
第一种方式是将dev分支merge进master有两种选择,让本地merge远端再push,推送到远端。
第二种方式是申请PR,管理员同意之后,可以直接将远端dev直接merge进远端master。
转到master分支,pull一下,保证master为最新版本。
然后轮流merge,同步成功。
最后git push。
删除分支
至此,dev分支已经没有用了,咱们卸磨杀驴删掉它就行。
版权归原作者 陈大大陈 所有, 如有侵权,请联系我们删除。