文章目录
以前有些过渡依赖“小乌龟”,关于Git基本上只会pull、add、push、commit,其余的git操作用的一团糟,本篇博客结合实例记录下平时常用的git操作。
一、创建版本库
1. 配置git环境
- 在
git
安装好以后,需要配置环境变量,命令行中输入以下命令:
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
git config --list
:查看当前的git配置;- 配置好环境后,使用命令
git init
,即可将当前目录变成一个git
可以管理的仓库; git
顺序:工作区 - - add - -> 暂存区 - - commit - -> 版本库 - - push - -> 远程版本库。> 1. 使用命令git add <文件名>
,将修改的文件添加到暂存区。> 2. 使用命令git commit -m "提交信息"
,将暂存区的文件提交到版本库。> 3. 使用命令git push
将本地版本库中的内容推送到远程版本库。> > 请注意,流程中的步骤 1 和 2 也可以使用命令 >> git commit -a -m "提交信息">
> 来完成,这样就省略了步骤 1的>> git add>
> 。
总的来说,使用
git
的流程就是先在本地仓库进行文件的修改和添加,然后使用
git add
将修改的文件添加到暂存区,最后使用
git commit
将修改的内容提交到本地版本库,最后使用
git push
将本地版本库中的内容推送到远程版本库。
二、时光机穿梭
1. 版本回退
git status
:查看仓库的当前状态;git diff
:查看上次修改的内容;git log
:显示所有提交日志,可以增加--pretty=oneline
参数减少输出,可以使用--graph --pretty=oneline --abbrev-commit
参数使输出更加直观;git reset --hard HEAD^
:回退到上一版本,在git
中,HEAD
表示当前版本,HEAD^
表示上一版本,HEAD^^
表示上上版本,HEAD~10
表示往前第10个版本;git reset --hard <commit_id>
:回退到指定的commit id
版本,commit id
可以不用输完整,输前几位就能找到;git reflog
:查看历史命令,可以用来找回commit id
。
记命令挺乏味的,下面结合一下具体项目里用到的流程讲解:
- 使用
git log
查看历史提交记录,找到需要回退到的版本的commit id
。 - 使用
git reset --hard <commit_id>
回退到指定的版本。注意,这个操作会把当前分支的指针直接移动到指定的版本,并且会丢弃当前分支中未提交的所有修改。如果你只是想撤销上次的提交,可以使用git reset HEAD~
命令,这样只会把未提交的修改撤销,而不会改变当前分支的指针。 - 如果你使用了
git reset --hard <commit_id>
命令将版本回退到了一个不正确的版本,或者因为某些原因你希望回到之前的版本,可以使用git reflog
查看历史命令记录,然后找到你希望回到的版本的commit id
,再使用git reset --hard <commit_id>
命令将版本回退到正确的版本。
注意, 一旦你使用了
git reset --hard
命令,之前的版本就会丢失,无法恢复。所以,在使用这个命令之前,一定要先备份重要的数据,以防万一。
2. 撤销修改
git restore <file_name>
:撤销对(工作区)文件的修改;git restore --staged <file_name>:
撤销已经git add
放到暂存区的文件;git reset --hard HEAD^
:撤销已经git commit
到版本库的修改,即回退到上一版本。--hard
表示之前的修改直接丢掉,--mixed(default)
表示之前的修改保留在工作区,--soft
表示之前的修改保留在暂存区。> 如果你使用的是 >> git reset --mixed HEAD^>
> 命令,会把之前的修改保留在工作区,而不会丢弃。你可以通过这个命令撤销已经提交到版本库的修改,但是保留在工作区,方便你继续修改。
3. 删除文件
git rm <file_name>
:删除版本库中的文件,需要再使用git commit
提交删除到版本库;- 若删除了工作区的文件,想从版本库中恢复到工作区,可以使用
git restore <file_name>
;
如果你使用了
git rm <file_name>
命令删除文件,并提交到版本库,那么这个文件就真正的从版本库中删除,无法恢复。所以,在使用这个命令之前,一定要先备份重要的数据,以防万一。
三、分支管理
1. 创建与合并分支
分支名以“dev”为例。
git checkout -b dev
:-b
参数表示创建并切换到dev
分支,该命令同git switch -c dev
;git merge dev
:合并dev
分支到当前分支;git merge --on-ff dev
:合并但禁用快速合并(推荐),因为dev
分支上可能会有很多零碎的提交,这种方式能够避免搅乱master
的提交历史;git branch -d dev
:删除dev
分支,参数-D
表示强制删除,用来删除还未合并的分支。
2. 解决冲突
- 若合并时存在冲突,使用
git status
查看冲突文件; - 然后手动编辑文件解决冲突。
示例,在冲突文件中,你会看到以下内容:
<<<<<<< HEAD
这是当前分支的内容
||||||| merged common ancestors
这是在两个分支中都存在的内容
=======
这是另一个分支的内容
>>>>>>> 另一个分支的名字
在上面的内容中:
<<<<<<< HEAD
和=======
之间的内容是当前分支的内容。||||||| merged common ancestors
之间的内容是两个分支中都存在的内容。=======
和>>>>>>> 另一个分支的名字
之间的内容是另一个分支的内容。
在解决冲突时,你需要删除上面的分割线和分支信息,并保留你希望在最终版本中保留的内容。例如:
这是我希望在最终版本中保留的内容
当你完成冲突解决之后,使用
git add <file_name>
命令将文件放到暂存区,然后使用
git commit
命令提交解决冲突的版本。需要注意的是,解决冲突时需要格外小心,因为如果误删除了重要的内容,可能会导致代码出错或功能失常。
3. Bug分支
修复Bug时,通常我们会创建新的Bug分支进行修复,然后合并,最后删除;
- 修复Bug时,通常我们会创建新的Bug分支进行修复。可以使用
git branch <branch_name>
命令创建新的分支,然后使用git switch <branch_name>
命令切换到新分支,也可以使用git switch -c <branch_name>
命令一次性创建并切换到新分支。 - 当手头工作没有完成,需要先
git stash
,这个命令会把你的工作现场储存起来,然后切换到最近的提交的版本。改完Bug后再用git stash pop
还原工作现场,可以使用git stash list
查看储藏列表; - 当你完成Bug修复工作之后,可以使用
git switch <branch_name>
命令切换到你希望合并的分支,然后使用git merge <branch_name>
命令将Bug分支合并到当前分支。如果希望禁用快速合并,可以使用git merge --no-ff <branch_name>
命令。 - 最后,你可以使用
git branch -d <branch_name>
命令删除Bug分支。如果Bug分支还没有被合并到当前分支,Git 会提示你不能删除。如果你希望强制删除Bug分支,可以使用git branch -D <branch_name>
命令。 - 在
master
分支上修复的Bug,可以通过git cherry-pick <commit_id>
将指定的提交复制到当前分支。
4. 多人协作
git remote -v
:查看远程分支详细信息。git push origin <branch_name>
:推送到远程指定的分支上。例如:如果你希望将本地的dev
分支推送到远程的origin
仓库的dev
分支上,可以执行git push origin dev
命令。git checkout -b dev origin/dev
:创建远程的dev
分支到本地。例如:如果你希望在本地创建dev
分支,并且这个分支对应的是远程的origin
仓库的dev
分支,可以使用git checkout -b dev origin/dev
命令来创建并切换到本地的dev
分支。git pull
:从远程获取最新版本并merge
到本地,会自动合并或修改当前的工作;git fetch
:从远程拉取到本地仓库,不会自动合并或修改当前的工作。你需要手动使用git merge
或git rebase
命令来合并远程分支。git branch --set-upstream-to=<remote_name>/<remote_branch_name> <local_branch_name>
命令设置本地分支与远程分支的链接。这样,在本地的分支上执行git pull
命令就会直接从远程分支上拉取了。例如:git branch --set-upstream-to=origin/dev dev
:设置dev
分支与远程origin/dev
分支的链接,链接完成后,在dev
分支中git pull
就会直接从origin/dev
上拉取了。- 在本地分支上执行
git rebase <branch_name>
命令,将本地分支的提交应用到另一个分支上。例如:在dev
分支上执行git rebase master
:若此时master上有新的提交,则用master上的新提交来作为dev的新基底,若master上没有新提交,则类似于进行了merge操作。一般公司里会禁用rebase,统一使用merge,因为rebase会整合分支提交记录,不清楚主线上谁合了代码以及他们合代码的先后顺序。注意:总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作。
参考文献
Git Book
版权归原作者 林慢慢脑瓜子嗡嗡的 所有, 如有侵权,请联系我们删除。