Git 常用命令

发布于 2025-02-21 12:44:34 字数 8913 浏览 6 评论 0

放弃文件修改

放弃 工作区 所作的修改

# 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>

image-20240101194216046

2. 使用 Fast forward 模式

合井分支 a 到分支 b, ff 参数表示使用 Fast forward 模式,合并后的历史会变成一条直线。

$ git merge --ff -m "message" <branch-name>

image-20240101194305506

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 addgit commit 完成合并。

这些命令将在终端内打开差异视图,但如果你更喜欢使用更直观的工具来比较差异的话,不妨试试 git difftoolMeld 是一款不错的查看器/编辑器,可用于直观地比较差异。

配置 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 变基(合并) 分支

rebasemerge 一样,可以合并分支。但有所区别:

  1. merge 不会破坏原分支的提交历史,方便回溯和查看。但会产生额外的提交节点,分支图比较复杂。
  2. rebase 不会新增额外的提交记录(而是把当前分支的每一个提交都“ 复制 “到目标分支上,然后再把当前分支指向目标分支),形成线性历史,直观且干净。但会改变提交历史,改变了当前分支 branch out 的节点, 应避免在共享分支使用

在不同的分支上执行 git rebase 变基操作,变基的方向也不同,它会移动你当前所在分支的和操作分支的公共节点。如下图:

  1. dev 分支上变基到 main 主分支上时,git 会先找到它们公共的祖先节点即 main:3 节点,再把 dev:1dev:2 两个节点嫁接到 main 主分支上。
  2. main 主分支上变基到 dev 分支上时,git 会先找到它们公共的祖先节点即 main:3 节点,再把 main:4main:5 两个节点嫁接到 dev 分支上。

image-20231230220257158

案例:

在实际项目中,我们都是多人配合协同开发,会将一些需求进行拆分,然后大家同时开发,开发完成后,各自将自己的代码合并到 develop 分支上。 在这过程中,如果某个组员已经开发完了并且将代码合并到了 develop 分支,而你还没开发完,但是这时你想同步这个组员的代码,这时就可以使用 git rebase 来做。

  1. feature-1feature-2 都是基于 develop 同一节点开出来的分支。
  2. 随着开发的进行, feature-1 先开发完成,并合并到 develop 分支。
  3. 此时 feature-2 利用 git rebase origin develop 来同步 feature-1 的代码。

git rebase -i 合并 commit 提交记录

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

是你

暂无简介

文章
评论
26 人气
更多

推荐作者

身边

文章 0 评论 0

qq_oxT0yE

文章 0 评论 0

卷着的草席

文章 0 评论 0

£冰雨忧蓝°

文章 0 评论 0

我还不会笑

文章 0 评论 0

Unbroken

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文