精通Git:介绍及常用命令指南

计算机基础计算机基础 2025-03-15 15:20:09 786
摘要: Git是每一个软件开发者以及团队的必备工具,它允许开发者们管理和跟踪他们的代码随时间的变化。以下是使用Git的介绍及一些常用命令的指南。Git的工作就是创建和保存你项目的快照及与之后的快照进行对比。本章将对有...

Git 是每一个软件开发者以及团队的必备工具,它允许开发者们管理和跟踪他们的代码随时间的变化。以下是使用Git的介绍及一些常用命令的指南。

Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。

本章将对有关创建与提交你的项目快照的命令作介绍。

Git 常用的是以下 6 个命令:git clonegit pushgit add 、git commitgit checkoutgit pull,后面我们会详细介绍。

 

 

说明:

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:版本库或本地仓库
  • remote repository:远程仓库

一个简单的操作步骤:

$ git init    
$ git add .    
$ git commit  
  • git init - 初始化仓库。
  • git add . - 添加文件到暂存区。
  • git commit - 将暂存区内容添加到仓库中。

什么是Git?

Git 是一个分布式版本控制系统。它使多个开发者能够同时在一个代码库上工作,而不会覆盖彼此的更改。它记录代码库的所有更改,允许开发者撤销更改、比较不同版本,并解决冲突。

如何使用Git

首先,确保您的系统已安装Git。如果没有,可以从Git的官方网站下载并安装。

常用Git命令

以下是一些在Git中最常用的命令:

  • git init: 在当前目录下创建一个新的Git仓库。这会创建一个新的名为.git的目录,其中包含所有Git需要的数据和元数据。
  • git clone [url]: 克隆(即复制)一个远程仓库。这将在您的本地机器上创建一个新的目录,其中包含远程仓库的所有文件和历史记录。
  • git add [file]: 将一个或多个文件添加到您的“暂存区”,以准备提交这些更改。
  • git commit -m "[descriptive message]": 提交您在暂存区的更改,这是一种将这些更改永久记录到仓库历史的方式。引号内的消息应描述您所做的更改。
  • git status: 查看哪些文件已经被修改,哪些文件已经被暂存,而哪些文件还未被Git跟踪。
  • git log: 查看仓库的提交历史。
  • git push: 将本地仓库的更改推送到远程仓库。
  • git pull: 从远程仓库获取最新的更改。
  • git branch: 列出仓库中所有的分支。
  • git checkout [branch-name]: 切换到指定的分支。
  • git merge [branch-name]: 将指定分支的更改合并到当前分支。
  • git stash : 将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。并恢复到云端gitlab的状态。
  • git stash apply:将git stash保存的内容恢复到本地,可能需要解决冲突
  • git log --oneline:查看每次改动的HEAD,以及提交的commit。 查看历史HEAD的版本号
  • git cherry-pick +HEAD(如195b5e6 或者 HEAD@{40}):只merge某一次HEAD的改动。选择这个分支,将改动pull下来。然后再合并冲突
  • git cherry-pick --continue # 合并完冲突之后,结束,不要新的commit
  • git cherry-pick --abort:取消某一次的merge改动
  • git reset HEAD^ 通常用于撤销最近的提交,但保留这些更改,使其处于未暂存的状态。(HEAD^ 或 HEAD~1 指向当前分支的前一个提交。)
  • git reset --hard HEAD:强行同步到某个分支。
  • git show 6d8d4a3 # 看这个分支做了什么改动
  • git rebase HEAD:git rebase xxx 变基pull下别人的分支 pull 别人的分支,注意本地和云端的区别
  • git fetch --all,获取所有已注册的远程及其分支。不能更新本地分支
  • git rebase --continue:先解决冲突,然后再用continue合并。一般情况下,修改后检查没问题,使用rebase continue来合并冲突。
  • git reflog 按G看全部:使用 git reflog 命令来查找你的分支历史,找到你想要回滚到的合并前的提交的哈希值。命令如下:
  • git commit --amend: 修改上一次commit信息,或者将这次的push,追加到上一次。不单独出commit。使用后再push -f,直接会上传到git上。git commit --amend --author="New Author Name <new.email@example.com>" --date='Mon, 30 Oct 2023 08:33:52 +0000'
  • git submodule update --init --recursive 初始化并更新子模块,仓库嵌套子仓库的情况下,能获得子仓库的代码。
  • git pull origin xxxx:用云端更新本地代码
  • git checkout origin/xxx
  • git push origin HEAD:xx : 当你在游离分支时(子模块),用这个指令,将改动push到某个分支。
  • git pre-commit 是一种 Git 钩子(hook),它允许你在每次提交(commit)之前执行特定的脚本或命令。可进行代码检查
  • git push --no-verify -u origin <branch_name> # 不进行验证操作,强行push。
  • git reset --soft origin/xxx : 将分支重置到远程分支的最新状态,同时保留工作目录中的更改。
  • git branch -r --contains 31e92f1a : 查看游离分支对应的云端分支
  • clang-format -i ./xxx : 对某个文件进行clang-format 格式化代码
  • git pull 报错 error: cannot lock ref xxxx ,只需要 git update-ref -d xxx后,再git pull即可。
  • git revert + xx commit: 将某个提交删掉。

解决冲突:在vscode中手动选择是保留传入还是保留本地代码,需要将所有的冲突解决后,可正常使用。

.gitignore忽略

/**/__pycache__/
/.venv*/
/tmp/

使用时候的小建议

1、和别人合作的时候,最好不要使用 git add . 来全部提交。有一些无用的更改,merge起来很比较麻烦。 最好的vscode中,手动选择每一个更改,是否需要提交或者放弃更改,或者保留在本地。
2、上传git的时候,不需要的东西不要上传。
3、 改文件名用git mv哈,不要直接在本地操作改名
4、在用merge合并的时候,注意云端和本地的区别。可能本地的代码库没更新,需要pull云端的代码。(或者将本地代码删掉,重新从云端获取。)
5、当想撤回本地上次的指令,使用git reflog + git reset --hard <commit-hash>
6、当想撤回到云端已提交的代码,可以使用 git log + git reset --hard <commit-hash> 来查看提交历史并找到需要回滚到的提交。

git常用示例

* 从gitlab云端更新至本地

git fetch origin # 更新本地仓库,可选,如果不加可能找不到需要checkout的分支
git branch # 查看所有分支
git checkout # 切换到你想要更新的分支
git pull # 更新改分支到本地
# 相当于执行了 git fetch 和 git merge 两个命令的组合。如果在拉取过程中有冲突产生,则需要手动解决冲突,再进行合并操作。


* 将本地的代码更新到GitLab的固定xx分支

确认当前所在分支,使用命令 git branch 查看。
切换到xx分支,使用命令 git checkout xx
同步远程分支,使用命令 git pull origin xx # origin xx 可以不加
以上为,将云端gitlab与本地的代码合并,需要解决可能出现的合并冲突。
提交合并后的代码,使用命令 git add . 将所有修改的文件添加到暂存区
然后使用命令 git commit -m "<commit-message>" 提交。
推送到GitLab,使用命令 git push origin xx。

* 新建一个分支,并将自己的代码push到分支中

git branch <branch_name> # 新建一个分支
git checkout <branch_name> # 切换到该分支。 git checkout -b <branch_name>可以用改命令,完成新建+切换
git add . # 添加代码:你现在可以在新分支上进行工作了。当你做完修改后,你需要将你的更改添加到 git 中
git commit -m "<commit_message>" # 提交代码:将更改添加到 git 后,你需要进行提交
git push -u origin <branch_name> # 推送到 GitLab:最后,你需要将你的分支推送到 GitLab。
git push --no-verify -u origin <branch_name> # 不进行验证操作。

如何删掉云端git分支(慎用,不要误删)

删掉云端git
git push origin --delete branch_name

删掉本地git
git branch -d branch_name
这将删除本地的指定分支,但只会在该分支的所有更改都已合并到其他分支后才起作用。
如果要强制删除尚未合并的本地分支,请使用 -D 选项:

git branch -D branch_name

如何将本地分支删掉,从git端获得新的分支。(删掉重建本地分支)

方法:
git branch -D XXX
git checkout -b XXX origin/XXX
解析:
git branch -D XXX: 这个命令会强制删除名为XXX的本地分支,即使它包含了一些还没有合并的更改。注意这是一个大写的-D,它会无条件地删除分支。如果你想先检查是否有未合并的更改,你可以使用小写的-d。
git checkout -b XXX origin/XXX: 这个命令会创建一个新的本地分支XXX,并将其设置为跟踪远程分支origin/XXX。然后它会检出这个新分支,这意味着你现在在这个新分支上。
这样做的好处是你不需要删除整个仓库和重新克隆,特别是当仓库很大的时候,这会节省时间。但是,这样做只会影响到特定的分支,而不是整个仓库。
请注意,在运行这些命令之前,确保你没有未提交的更改,或者你愿意放弃所有未提交的更改。这些命令会删除分支以及与其相关的所有更改。如果你在这个分支上有未提交的更改,它们将被永久删除。

 

origin的含义是什么?



* origin的含义是什么?

origin 是远程仓库(remote repository)的默认名称,在你执行 git clone 命令克隆一个仓库时,Git 会自动给这个远程仓库起这个名字。它实际上是远程仓库URL的一个简短别名。

当你执行像 git pull origin master 这样的命令时,Git 会去 origin(也就是你克隆的源仓库)查找名为 master 的分支,并将其拉取到本地。

你可以使用 git remote -v 命令查看所有远程仓库及其URL。

 

git怎么合并到上一次的commit

git commit --amend 后 (:wq保存,也可以对上一次的commit进行修改)
git push -f (强制push到分支,不是自己的分支,千万不要加f)

git 创建合并请求

如果想要将A分支合并到main分支中,需要创建合并请求MR
1. 先将main merge到 A分支中,解决冲突
2. 验证合并后未出现错误,代码可以正常运行
3. 在git网站上,点击合并请求,将A合并到main中即可。

git 怎么将多个commit合成一个

总结:
将多个commit合成一个
先 git log ,查看有多少个commit
git rebase -i HEAD~30   看前30个commit
然后将不要的pick改完f。  移到pick的k位置,然后按ciw
最后:wq即可

具体看git rebase的用法
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)(我习惯用f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)

s与f的区别
squash (s): 将当前提交与前一个提交合并,并允许你编辑提交消息。
fixup (f): 将当前提交与前一个提交合并,但会丢弃当前提交的提交消息,只保留前一个提交的消息。
你应该使用哪一个取决于你的需求:
如果你想合并多个提交并编辑一个新的、综合的提交消息,那么使用 squash。
如果你只是想合并提交而不关心保留每个提交的消息,那么使用 fixup 可能更简单。
在大多数情况下,如果你想将多个提交压缩成一个并为其提供一个有意义的消息,那么 squash 是更常见的选择。

git merge

git fetch origin  # 获取最新的远程仓库信息:
git branch -r  # git fetch origin
git merge origin/feature-branch  # 合并远程分支
# 解决可能出现的冲突

git 怎么修改commit消息

git rebase修改已提交的commit信息​juejin.cn/post/7181796806420873276
修改最后一次提交的 commit信息
% git commit --amend --message='delte file to update commit msg'


修改历史提交的 commit 信息
操作步骤:
git rebase -i HEAD~3
找到需要修改的 commit 记录,把 pick 修改为 edit 或 e,:wq 保存退出
修改 commit 的具体信息git commit --amend,修改commit信息,保存并继续下一条git rebase --continue,直到全部完成
中间也可跳过或退出git rebase (--skip | --abort)

例如,尝试修改commit id 为 ‘9b9133f’ 的message信息,具体操作如下。

  • 通过 git rebase 至 待修改的commit message的前一个commit ID。
  • git rebase -i 6be1bd9
  • 找到要修改的commit记录,把 pick 修改为 e:wq 保存退出
  • 修改 commit 的具体信息git commit --amend,系统会弹出一个交互的窗口,修改结束后,:wq 保存退出.
  • 继续下一条git rebase --continue,直到全部完成.

git 怎么修改上一个commit的作者、时间

git commit --amend: 修改上一次commit信息,或者将这次的push,追加到上一次。不单独出commit。使用后再push -f,直接会上传到git上。
git commit --amend --author="New Author Name <new.email@example.com>"  --date='Mon, 30 Oct 2023 08:33:52 +0000'

git rebase的用法1:合并多个commit

rebasegit中是一个非常有魅力的命令,使用得当会极大提高自己的工作效率;相反,如果乱用,会给团队中其他人带来麻烦。它的作用简要概括为:可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因此,合理使用rebase命令可以使我们的提交历史干净、简洁!
前提:不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外)
当我们在本地仓库中提交了多次,在我们把本地提交push到公共仓库中之前,为了让提交记录更简洁明了,我们希望把如下分支B、C、D三个提交记录合并为一个完整的提交,然后再push到公共仓库。


下面开始实践rebase命令

snowzhang@snowdeMBP-2:~/gitLearn$     git log
commit 9a931be7950033df6905b8b77dc590cdfc37367c (HEAD -> master)
Author: snowzhang <snxxxxxxx@aliyun.com>
Date:   Wed Jul 11 15:50:55 2018 +0800

    commit D

commit 68b8f4ce42e0201fb731085790ffeb190d9747b5
Author: snowzhang <snxxxxxxx@aliyun.com>
Date:   Wed Jul 11 15:50:06 2018 +0800

    commit C

commit d9bebec678b202ac388518ed0aed3a2fb7bc85b3
Author: snowzhang <snxxxxxxx@aliyun.com>
Date:   Wed Jul 11 15:49:27 2018 +0800
  • 首先创建三次次提交BCD
 这里我们使用命令:
 git rebase -i  [startpoint]  [endpoint] 
 其中-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint]  [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。
在查看到了log日志后,我们运行以下命令:
 git rebase -i ce42e8889 
   
 

https://waynerv.com/posts/git-rebase-intro/
我们将按照上面的命令提示,修改pick成下面这样

pick d9bebec commit B
s 68b8f4c commit C
s 9a931be commit D

最终查看git log会给出这样的提示
commit 3ab108fd7e0fb3a7477763f2ef8032251105e69f (HEAD -> master)
Author: snowzhang <snxxxx@aliyun.com>
Date:   Wed Jul 11 15:49:27 2018 +0800

    commit B

    commit C

    commit D
证明我们已经将BCD三次提交合并成一次提交了。

如果自己的分支修改了太多,rebase到主线很麻烦,那可以先用rebase把自己的分支简化一下。(或者,在主线上merge自己的分支,然后push上去)

简单来说,常用的:
不需要的commit改成 s。
然后会合并到上面一个commit

git rebase的用法2:变基rebase 与 merge的区别

git rebase详解(图解+最简单示例,一次就懂)​blog.csdn.net/weixin_42310154/article/details/119004977
git的突出解决--git rebase之abort、continue、skip​www.cnblogs.com/chenjunjie12321/p/6876220.html
git rebase 和 git merge 是两种不同的版本控制操作,它们在合并分支时有不同的工作流和影响。以下是它们之间的主要区别:

工作流不同:
Rebase(变基):Rebase 的目的是将当前分支的提交移动到目标分支之上。在 rebase 过程中,会将当前分支的提交一个一个地应用到目标分支上,就好像它们是在目标分支上提交的一样。这会使提交历史看起来更加线性,没有合并提交。
Merge(合并):Merge 的目的是将一个分支的更改合并到另一个分支上。在 merge 过程中,会创建一个新的合并提交,将两个分支的更改合并在一起。这会在提交历史中创建一个合并节点,显示两个分支的合并点。

提交历史不同:
Rebase 会产生一个线性的提交历史,因为它将提交一个一个地应用到目标分支上。这可以使提交历史更加整洁,但可能会使分支历史难以理解,因为它们似乎没有分叉或合并。
Merge 会在提交历史中创建合并节点,显示两个分支的合并点。这可以更清晰地反映分支之间的关系,但可能会导致提交历史较复杂,因为它包括了合并节点。

潜在冲突处理:
Rebase 可能在应用提交时触发冲突,这时您需要解决冲突并继续 rebase。这使得冲突解决更分散,但也更容易管理。
Merge 在创建合并提交时,如果存在冲突,会在合并提交中标记冲突,您需要解决冲突后再提交一个合并提交。

合并的视觉效果:
Rebase 可以使提交历史更加干净,因为它没有合并提交。但这也可能使得分支关系更难以理解。
Merge 保留了分支之间的关系,因为它创建了明确的合并节点。

使用场景:
Rebase 通常用于保持提交历史的整洁,特别是在将要合并到主分支(如 master)时。它适合用于私有分支,以便更容易理解提交历史。
Merge 用于合并分支的最终更改,通常用于公共分支(如 master)或在多人协作时,因为它会保留更明确的合并历史。
总之,选择使用 git rebase 还是 git merge 取决于您的工作流和项目的需要。通常,您可以根据情况使用两者中的一种或混合使用,以满足项目的需求。重要的是要理解它们的不同之处以及何时使用哪种方法。

撤销上次git操作,或者同步到上次提交。 log、relog、reset

① 查看所有的git操作
查找合并前的提交: 使用 git reflog 命令来查找你的分支历史,找到你想要回滚到的合并前的提交的哈希值。命令如下:
git reflog
这将列出你分支的操作历史,包括合并操作。找到你要回滚到的操作对应的哈希值。

② 查看所有的提交记录
运行 git reflog 命令查看您的仓库操作历史。此命令将显示您的仓库中的每个操作,包括合并。
找到您想要回滚到的操作的索引,它通常是 "merge" 操作的索引,例如 HEAD@{1}。

回滚到合并前的提交: 使用 git reset 命令将分支回滚到合并前的提交。将 <commit-hash> 替换为你在步骤 1 中找到的提交哈希值。例如:
git reset --hard <commit-hash> (或者 HEAD@{1})
这将取消合并并将分支恢复到合并前的状态。

git rebase 合并的使用方法

git rebase origin/xxx
解决冲突后,git add .
git rebase --continue
直到所有的rebase都解决。(出现冲突,选择保留当前更改,然后解决所有冲突后合并。)


git rebase --skip   跳过这次提交
最后,git push -f,强行push上去

注意,需要fetch,不然可能不是B最新的代码。记得,B前面如果是云端,需要加origin/B
在A的环境下使用,git rebase B
是指在B最新的代码上,将A新的改动一步一步在最新代码上进行覆盖,有冲突则解决冲突。使用当前修改,指的是B最新的代码。
使用传入是指,A中每一步的改动。 需要自己解决冲突。
如果不是B最新的代码,需要先fetch,然后再用git rebase B。可以自动解决以前修改的冲突。