Git 常用命令
放弃文件修改
放弃 工作区
所作的修改
# 1. 放弃特定文件的修改
$ git restore <file>
# 2. 放弃所有文件的修改
$ git checkout .
# 或者
$ git checkout head .
# 3. 撤销尚未提交的单个后缀文件
$ git checkout *.后缀
# 或者
$ git checkout head *.后缀
放弃 暂存区
所作的修改
$ git restore --staged <file> # git add 的反向操作
放弃 已提交
的修改
# 4. 恢复一个文件到之前的版本
$ git checkout <file> <commit-hash>
branch
分支操作
git
命令行中一些参数选项解释:
-d 或者 --delete:删除
-D 或者 --delete --force:强制删除
-f 或者 --force:强制
-m 或者 --move:移动或重命名
-M 或者 --move --force:强制移动或重命名
-r 或者 --remote:远程
-a 或者 --all:所有
1. 创建新分支
# 1.创建本地分支并切换到该分支
$ git checkout -b <new_branch_name>
# 等同于
$ git branch <new_branch_name> # 或者 git branch <new_branch_name> <base_branch_name>
$ git checkout <new_branch_name>
# 2. 基于某个分支开出新分支
$ git branch <new-branch> <base-branch>
# 3. 基于某个提交开出新分支
$ git branch <new-branch> <commit_hash>
# 4.基于某个 tag 开出有新分支
$ git branch <new-branch> <tag-name>
创建新分支之后,需要将该分支推送到远程:
$ git push --set-upstream <origin-name> <远程分支名>
2. 删除分支
# 1. 强制删除本地分支
$ git branch -D <branch-name>
# 2. 删除远程分支
$ git push -d <origin-name> <branch-name>
# 3.删除本地和远程分支,删除后还需推送到服务器
$ git branch -d -r <branch-name>
$ git push <origin-name>:<branch-name>
3. 重命名分支
$ git branch -m <old-branch> <new-branch> # 重命名本地分支
4. 查看分支
# 1. 查看 本地 所有分支,同时以*确认当前所在分支
$ git branch
# 2. 查看 本地和远程 所有分支,同时以*确认当前所在分支
$ git branch -a
# 3. 查看 远程 所有分支
$ git branch -r
# 4. 以图表形式查看分支
$ git log --graph
remote
源地址操作
1. 添加项目源地址
# 1. 添加一个源地址为要提交的仓库地址
$ git remote add <remote_name> <remote_url>
# 2. 添加完源地址后,推送分支
$ git push -u <remote_name> <branch-name>
# 从远程仓库拉取代码
$ git pull <remote-name> <branch-name>
-u
参数 可以在推送的同时,将 <remote_name>
仓库的 branch-name
分支设置为本地仓库当前分支的 upstream
(上游)。添加了这个参数,将来运行 git pull
命令从远程仓库获取内容时,本地仓库的这个分支就可以直接从 <remote_name>
的 branch-name
分支获取内容,省去了另外添加参数的麻烦。
2. 查看项目源地址
$ git remote -v
origin git@github.com:refinec/FrontEndNotes.git (fetch)
origin git@github.com:refinec/FrontEndNotes.git (push)
3. 删除项目源地址
$ git remote remove <origin_name> # 删除源地址
4. 重命名远程仓库
$ git remote <old-name> <new-name>
git merge
合并分支
$ git switch main # 先切换到要合并的分支上
$ git merge dev # 把 dev 分支合并到 main 分支上
1. 禁用 Fast forward
模式
合井分支 a 到分支 b, no-ff
参数表示禁用 Fast forward
模式,合并后的历史有分支,能看出曾经做过合并。
$ git merge -no-ff -m "message" <branch-name>
2. 使用 Fast forward
模式
合井分支 a 到分支 b, ff
参数表示使用 Fast forward
模式,合并后的历史会变成一条直线。
$ git merge --ff -m "message" <branch-name>
3. 使用 squash
压缩记录
合井 squash
所有提交到一个提交,被合并的分支的 commit
记录不会出现
$ git merge -squash <branch-name>
git diff
比较差异
1. 查看工作区、暂存区、本地仓库之间的差异
$ git diff # 默认比较工作区和暂存区之间的差异内容.
$ git diff HEAD # 比较工作区和本地仓库之间的差异内容
$ git diff --cached # 比较暂存区和本地仓库之间的差异内容. cached 也可以改成 staged
2. 查看不同版本之间的差异
$ git diff <commit_hash_1> <commit_hash_2> # 比较两个特定版本之间的内容
$ git diff HEAD~ HEAD # 比较上一个版本和当前版本之间的差异。HEAD~等同于 HEAD^表示上一个版本
$ git diff HEAD^3 HEAD # 比较之前第三个版本和当前版本之间的差异
$ git diff HEAD^3 HEAD xxx.txt # 比较之前第三个版本和当前版本中 xxx.txt 文件之间的差异
3. 查看不同分支之间的差异
$ git diff <branch_name1> <branch_name2>
4. 解决合并冲突 conflict
打开冲突文件来查看具体冲突内容
# GitTest
For git command practice
<<<<<<< HEAD
chagne README file on the main branch //内容 1
=======
do something on develop branch //内容 2
>>>>>>> develop
冲突的内容会被 <<<<<<<
与 >>>>>>>
所包围,中间用 =======
隔离开,也就如我所注释的分成了 内容 1
与 内容 2
两块。
内容 1
:是当前所在分支节点的内容,也就是main
。内容 2
:要合并进来分支的内容,也就是develop
。
选择你要的内容,将 <<<<<<<
、 >>>>>>>
、 =======
这些隔离符删除掉,并保存,然后执行 git add
、 git commit
完成合并。
这些命令将在终端内打开差异视图,但如果你更喜欢使用更直观的工具来比较差异的话,不妨试试 git difftool
。 Meld
是一款不错的查看器/编辑器,可用于直观地比较差异。
配置 Meld
:
$ git config --global diff.tool git-meld
查看差异:
$ git difftool $start_commit..$end_commit -- path/to/file
# 或者
$ git difftool $start_commit..$end_commit
git blame
查看谁更改了文件中某一行代码
$ git blame -w # ignores white space
$ git blame -M # ignores moving text
$ git blame -C # ignores moving text into other files
git commit --amend
修改上次 commit
信息
修改最近一次提交的 commit
文本信息
$ git commit --amend
# 或者
$ git commit --amend -m "重新提交的信息"
git stash
暂时保存当前开发内容
比如某天你正在认真的开发需求中,测试过来找你让你帮忙看一个线上问题。此时,你代码也刚写了一半,不想提交,这时怎么办?
此时我们可以通过 git stash
来暂存我们代码,然后切换到线上环境分支排查问题,解决后,切换回之前分支执行 git stash pop
继续开发。
$ git stash save "未完成的功能" # 暂存在 stash
$ git stash pop # 取出第一个 stash
git stash
的常用操作
# 保存到 stash 栈中,并加上自定义 message 修饰。save 参数表示存储的信息,可以不写
$ git stash save "message"
# 查看所有 stash
$ git stash list
# 恢复最近一次 stash
$ git stash pop
# 恢复指定的 stash,stash@{2}表示第三个 stash,stash@(0}表示最近的 stash
$ git stash pop stash@{2}
# 应用最近一次 stash
$ git stash apply
# 应用 stash 栈中的第 x 个元素,pop 是应用的同时且从栈中删除,而 apply 则是只应用不删除
$ git stash apply stash@{x}
# 删除 stash 栈中的第 x 个元素
$ git stash drop stash@{x}
# 删除所有 stash
$ git stash clear
git rebase
变基(合并) 分支
rebase
同 merge
一样,可以合并分支。但有所区别:
merge
不会破坏原分支的提交历史,方便回溯和查看。但会产生额外的提交节点,分支图比较复杂。rebase
不会新增额外的提交记录(而是把当前分支的每一个提交都“ 复制 “到目标分支上,然后再把当前分支指向目标分支),形成线性历史,直观且干净。但会改变提交历史,改变了当前分支branch out
的节点, 应避免在共享分支使用 。
在不同的分支上执行 git rebase
变基操作,变基的方向也不同,它会移动你当前所在分支的和操作分支的公共节点。如下图:
- 在
dev
分支上变基到main
主分支上时,git 会先找到它们公共的祖先节点即main:3
节点,再把dev:1
和dev:2
两个节点嫁接到main
主分支上。 - 在
main
主分支上变基到dev
分支上时,git 会先找到它们公共的祖先节点即main:3
节点,再把main:4
和main:5
两个节点嫁接到dev
分支上。
案例:
在实际项目中,我们都是多人配合协同开发,会将一些需求进行拆分,然后大家同时开发,开发完成后,各自将自己的代码合并到 develop
分支上。 在这过程中,如果某个组员已经开发完了并且将代码合并到了 develop
分支,而你还没开发完,但是这时你想同步这个组员的代码,这时就可以使用 git rebase
来做。
feature-1
与feature-2
都是基于develop
同一节点开出来的分支。- 随着开发的进行,
feature-1
先开发完成,并合并到develop
分支。 - 此时
feature-2
利用git rebase origin develop
来同步feature-1
的代码。
git rebase -i
合并 commit
提交记录
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: 了解 Git
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论