当你在Git中进行更改并准备将这些更改保存到版本历史中时,你需要使用git commit
命令。
语法:git commit -m "commit message"
-m
选项:用于指定提交的消息。这是一个必需的选项,你需要在引号中提供一个简短但有意义的消息来描述你的更改。
提交消息:提交消息应该清楚地描述你所做的更改。它应该是简洁的,但足够详细以便其他人能够理解你的更改的目的。
提交的内容:git commit
命令将你在工作目录中的所有已暂存更改提交到本地仓库中。这些更改包括新添加的文件、修改的文件和删除的文件。
提交历史:每次使用git commit
命令时,都会创建一个新的提交对象,并将其添加到版本历史中。你可以使用git log
命令查看提交历史。
提交的顺序:提交是按照提交的顺序进行的,每个提交都有一个唯一的标识符(commit hash)。这些标识符可以用于引用特定的提交。
提交的修改:如果你在提交后发现需要进行更改,你可以使用git commit --amend
命令来修改最后一次提交。这将创建一个新的提交对象,替换掉之前的提交。
提交的作者:每个提交都有一个作者和一个提交者。默认情况下,这些值是根据你的Git配置自动设置的,但你也可以使用git commit --author
选项来手动设置。
这些是关于git commit
命令的一些基本知识点。通过使用这个命令,你可以将你的更改保存到版本历史中,并与其他人共享你的工作。
当你在Git中进行开发时,你可以使用git branch
命令来管理分支。
语法:git branch [branch_name]
不带参数:如果你只输入git branch
命令,它会列出所有的本地分支,并在当前分支前面加上一个星号。
创建分支:要创建一个新的分支,你可以使用git branch
命令后跟一个分支名称。例如,git branch feature
将创建一个名为"feature"的新分支。
切换分支:要切换到一个已存在的分支,你可以使用git checkout
命令后跟分支名称。例如,git checkout feature
将切换到名为"feature"的分支。
创建并切换分支:你也可以使用git checkout -b
命令来创建一个新的分支并立即切换到该分支。例如,git checkout -b feature
将创建一个名为"feature"的新分支并切换到该分支。
删除分支:要删除一个已存在的分支,你可以使用git branch -d
命令后跟分支名称。例如,git branch -d feature
将删除名为"feature"的分支。
查看远程分支:要查看远程仓库中的分支,你可以使用git branch -r
命令。这将列出所有的远程分支。
查看所有分支:要查看本地和远程仓库中的所有分支,你可以使用git branch -a
命令。这将列出所有的本地分支和远程分支。
通过使用这个命令,你可以创建、切换、删除和查看分支,以便在Git中进行更灵活的开发。
当你在Git中使用分支进行开发时,你可能需要将一个分支的更改合并到另一个分支中。这时可以使用git merge
命令。
语法:git merge
合并分支:git merge
命令用于将指定分支的更改合并到当前分支中。例如,如果你在master
分支上执行git merge feature
,则会将feature
分支的更改合并到master
分支中。
快进合并:如果要合并的分支的提交历史可以直接应用到当前分支上,那么Git会执行快进合并(fast-forward merge)。这意味着当前分支会直接指向要合并的分支的最新提交。
非快进合并:如果要合并的分支的提交历史与当前分支有分叉,那么Git会执行非快进合并(non-fast-forward merge)。这时会创建一个新的合并提交,将两个分支的更改合并在一起。
冲突解决:在合并过程中,如果两个分支对同一个文件的同一部分进行了修改,就会发生冲突。Git会在合并时标记出冲突的部分,你需要手动解决冲突并提交解决后的文件。
合并冲突:当发生冲突时,你可以使用git status
命令查看冲突的文件,并手动编辑这些文件以解决冲突。解决冲突后,使用git add
命令将解决后的文件标记为已解决,然后使用git commit
命令提交合并结果。
合并策略:Git提供了不同的合并策略,可以通过git merge
命令的--strategy
选项来指定。常用的合并策略包括默认的递归合并策略(recursive merge strategy)、合并忽略空白字符(ignore whitespace changes merge strategy)等。
通过使用这个命令,你可以将一个分支的更改合并到另一个分支中,使得不同分支上的工作得以整合。在合并过程中,需要注意解决可能发生的冲突。
当你在Git中使用分支进行开发时,你可能需要将一个分支的更改应用到另一个分支上,而不是简单地合并分支。这时可以使用git rebase
命令。Rebase
实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。Rebase
的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase
的话,代码库的提交历史将会变得异常清晰。
语法:git rebase
rebase
操作:git rebase
命令用于将当前分支的更改应用到指定分支上。它会将当前分支的提交逐个应用到目标分支上,并创建新的提交。
rebase
与合并的区别:与git merge
命令不同,git rebase
命令会将当前分支的提交重新应用到目标分支上,而不是简单地将两个分支的更改合并在一起。这样可以使提交历史更加线性和整洁。
冲突解决:在rebase
过程中,如果两个分支对同一个文件的同一部分进行了修改,就会发生冲突。与合并不同,rebase
冲突的解决方式是在应用每个提交时解决冲突。你需要手动解决冲突并使用git rebase --continue
命令继续rebase
操作。
rebase
的优势:相比合并,rebase
可以使提交历史更加整洁和直观。它可以将多个提交合并为一个,减少了不必要的合并提交。
注意事项:由于rebase
会改变提交历史,因此不建议在公共分支上进行rebase
操作。如果你在公共分支上进行rebase
,可能会导致其他人的工作出现问题。
强制推送:在变基后,你可能需要使用git push
命令的--force
选项来强制推送到远程仓库。这是因为rebase
会改变提交历史,需要覆盖远程仓库中的提交。
通过使用这个命令,你可以将当前分支的更改应用到目标分支上,并使提交历史更加整洁和直观。在进行rebase
操作时,需要注意解决可能发生的冲突,并谨慎使用强制推送。
git log
:这个命令将显示提交历史,包括每个提交的哈希值。默认情况下,它会按照最新的提交显示在最上面。你可以使用上下箭头键来浏览提交历史。每个提交的哈希值通常是一个长字符串,例如commit 1234567890abcdef
。
git show
:这个命令将显示指定提交的详细信息,包括提交的哈希值。你可以使用git show
来查看特定提交的详细信息。例如,git show 1234567890abcdef
将显示哈希值为1234567890abcdef
的提交的详细信息。
git reflog
:这个命令将显示引用日志,包括分支、标签和HEAD的移动记录。每个移动操作都会显示相应的提交哈希值。你可以使用git reflog
来查看提交历史中的所有操作,包括已经被删除的分支和重置操作。
这些命令可以帮助你查看提交的哈希值,并在Git中进行提交历史的浏览和分析。提交的哈希值是唯一的,可以用于引用特定的提交。
在Git中,你可以使用一些命令来在提交树上前后移动。下面是一些相关的知识点:
git checkout
:这个命令可以用于在提交树上移动到不同的提交。你可以使用提交的哈希值、分支名或标签名作为参数。例如,git checkout
将使你移动到指定的提交。
git branch -f
:这个命令可以用于移动分支的指针到不同的提交。你可以使用分支名和提交的哈希值作为参数。例如,git branch -f
将使指定分支的指针移动到指定的提交。
git reset
:这个命令可以用于将当前分支的指针移动到不同的提交,并且可以选择是否保留更改。有三种不同的重置模式:--soft
、--mixed
和--hard
。--soft
模式将保留更改,--mixed
模式将取消暂存的更改,--hard
模式将丢弃所有更改。例如,git reset --soft
将将当前分支的指针移动到指定的提交,并保留更改。
git cherry-pick
:这个命令可以用于选择性地将一个或多个提交应用到当前分支。你可以使用提交的哈希值作为参数。例如,git cherry-pick
将将指定的提交应用到当前分支。
这些命令可以帮助你在提交树上前后移动,从而在Git中进行更灵活的操作。请注意,在移动提交或分支时,要小心不要丢失或覆盖重要的更改。
在Git中,HEAD是一个特殊的指针,它指向当前所在的分支或提交。
当前分支:在大多数情况下,HEAD指向当前所在的分支。例如,如果你当前在master
分支上,那么HEAD将指向master
分支。
最新提交:如果你在进行提交操作后,HEAD将指向最新的提交。这表示你当前所在的分支已经包含了最新的提交。
分离头指针(Detached HEAD):当你切换到一个特定的提交时,HEAD将进入分离头指针状态。这意味着HEAD不再指向任何分支,而是直接指向一个提交。在这种状态下,你可以查看和修改提交,但新的提交将不会与任何分支相关联。
HEAD的移动:你可以使用git checkout
命令来移动HEAD到不同的分支或提交。例如,git checkout
将移动HEAD到指定的分支,git checkout
将移动HEAD到指定的提交。
HEAD的引用:在Git中,你可以使用HEAD来引用当前分支或提交。例如,HEAD~1
表示HEAD的父提交,HEAD^
也表示HEAD的父提交。
HEAD的重置:你可以使用git reset
命令来重置HEAD的位置。这可以用于撤销提交、移动分支指针或修改提交历史。
HEAD的用途:HEAD在Git中有多种用途,包括切换分支、查看提交历史、合并分支、重置提交等。它是Git中非常重要的一个指针。
理解和正确使用HEAD对于有效地使用Git非常重要。它可以帮助你在不同的分支和提交之间进行切换,并进行各种操作。
在Git中,相对引用是一种引用提交的方式,它使用相对于当前提交的位置来指定提交。相对引用可以帮助我们更方便地引用提交,而不需要记住或输入完整的提交哈希值。下面是一些常用的相对引用:
HEAD
:HEAD
是相对引用中最常见的一个。它指向当前所在的分支或提交。例如,HEAD~1
表示HEAD的父提交,HEAD^
也表示HEAD的父提交。feature
表示feature
分支的最新提交。^
表示父提交。例如,HEAD^
表示HEAD的父提交,feature^
表示feature
分支的父提交。fature^^
表示feature
分支的父提交的父提交。
fature^2
表示第二个父提交。~
表示向上移。使用 ~
向上移动多个提交记录,如 ~3
,表示向上移动3个记录。git checkout~^2~2
,表示先向上移动一次,然后向第二个父提交移动一次,再向上移动两次。要使用相对引用强制修改分支位置,可以使用git branch -f
命令。以下是具体的步骤:
首先,使用git branch
命令查看当前的分支列表,确定要修改位置的分支名称。
然后,使用git branch -f
命令,将
替换为要修改位置的分支名称,将
替换为要将分支移动到的目标提交的相对引用。
例如,要将分支feature
移动到当前分支的前一个提交上,可以使用以下命令:
git branch -f feature HEAD~1
如果要将分支移动到另一个分支的最新提交上,可以使用以下命令:
git branch -f feature other-branch
最后,使用git branch
命令再次查看分支列表,确认分支位置已经被成功修改。
请注意,使用相对引用强制修改分支位置会丢失分支上的所有未提交的更改。因此,在执行此操作之前,请确保已经保存并提交了所有重要的更改。
在Git中,有几种方法可以撤销变更。以下是常用的几种方法:
git checkout
:使用git checkout
命令可以撤销对文件的修改。可以使用以下命令将文件恢复到最新的提交状态:
git checkout --
其中,
是要撤销修改的文件路径。
git reset
:使用git reset
命令可以撤销提交。可以使用以下命令将分支指针移动到之前的提交,同时保留修改的文件:
git reset
其中,
是要回退到的提交的引用。
PS:虽然在你的本地分支中使用
git reset
很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!
git revert
:使用git revert
命令可以创建一个新的提交,撤销之前的提交。可以使用以下命令撤销指定的提交:
git revert
其中,
是要撤销的提交的引用。
git stash
:使用git stash
命令可以将当前的修改保存到一个临时区域,以便稍后恢复。可以使用以下命令将修改保存到stash中:
git stash save "message"
然后,可以使用git stash apply
命令将修改恢复到工作区。
请注意,这些方法都会对Git仓库进行修改,因此在执行这些操作之前,请确保已经保存并提交了重要的更改。
用于选择性地将一个或多个提交应用到当前分支上。它的作用类似于将某个分支上的提交复制到另一个分支上。
语法:git cherry-pick
,其中
是要应用的提交的引用。
应用单个提交:可以使用git cherry-pick
命令将单个提交应用到当前分支上。例如,要将提交abc123
应用到当前分支上,可以使用以下命令:
git cherry-pick abc123
应用多个提交:可以使用git cherry-pick
命令一次性应用多个提交。可以指定多个提交的引用,或者使用范围表示多个提交。例如,要将提交abc123
、def456
和ghi789
应用到当前分支上,可以使用以下命令:
git cherry-pick abc123 def456 ghi789
或者,可以使用范围表示:
git cherry-pick abc123..ghi789
冲突解决:在应用提交时,如果发生冲突,Git会暂停应用过程并提示解决冲突。需要手动解决冲突后,使用git add
命令将解决后的文件标记为已解决,然后使用git cherry-pick --continue
命令继续应用提交。
应用顺序:git cherry-pick
会按照提交的顺序应用到当前分支上。如果有多个提交需要应用,并且其中某个提交的应用会导致冲突,那么在解决冲突之前,后续的提交不会被应用。
提交信息:默认情况下,git cherry-pick
会将原始提交的提交信息复制到新的提交中。可以使用-x
选项将原始提交的引用添加到新的提交信息中。
请注意,git cherry-pick
会在当前分支上创建新的提交,因此在执行此操作之前,请确保已经保存并提交了重要的更改。
交互式的 rebase(交互式变基)是Git中一个强大的命令,它允许你在重新应用提交时进行交互式操作,例如重新排序、编辑提交消息、合并提交等。以下是关于交互式 rebase 的一些重要知识点:
语法:git rebase -i
,其中
是要进行交互式 rebase 的基准提交的引用。
打开交互式 rebase 编辑器:执行git rebase -i
命令后,Git会打开一个文本编辑器,显示一个包含待应用提交的列表。
重新排序提交:在交互式 rebase 编辑器中,你可以通过修改提交的顺序来重新排序它们。只需将提交的行拖动到所需的位置即可。
编辑提交消息:在交互式 rebase 编辑器中,你可以修改每个提交的提交消息。只需将提交的行中的pick
关键字替换为reword
,然后保存并关闭编辑器。Git会在应用提交时提示你编辑提交消息。
合并提交:在交互式 rebase 编辑器中,你可以将多个连续的提交合并为一个提交。只需将要合并的提交的行中的pick
关键字替换为squash
或fixup
,然后保存并关闭编辑器。Git会在应用提交时将这些提交合并为一个提交,并提示你编辑合并后的提交消息。
跳过提交:在交互式 rebase 编辑器中,你可以选择跳过某个提交。只需将要跳过的提交的行中的pick
关键字替换为drop
,然后保存并关闭编辑器。Git会在应用提交时跳过这个提交。
中止 rebase:如果在交互式 rebase 过程中遇到问题,你可以使用git rebase --abort
命令中止 rebase,并恢复到 rebase 前的状态。
请注意,交互式 rebase 可能会改变提交的历史记录,因此在执行此操作之前,请确保你了解其潜在的影响,并确保已经保存并提交了重要的更改。
在Git中,可以使用git cherry-pick
命令来提取一个提交记录。git cherry-pick
命令允许你选择性地将一个或多个提交应用到当前分支上。
要只提取一个提交记录,可以按照以下步骤进行操作:
首先,使用git log
命令查看提交记录,并找到要提取的提交的哈希值(commit hash)。
然后,使用git cherry-pick
命令,将
替换为要提取的提交的哈希值。
例如,要提取提交abc123
,可以使用以下命令:
git cherry-pick abc123
如果要提取的提交在当前分支之外,可以使用
的形式来引用提交。其中,
是包含要提取的提交的分支名称,
是要提取的提交在该分支上的相对位置。
例如,要提取分支feature
上的最新提交,可以使用以下命令:
git cherry-pick feature~1
Git会将选定的提交应用到当前分支上,并创建一个新的提交。
请注意,使用git cherry-pick
命令提取提交时,可能会发生冲突。如果发生冲突,需要手动解决冲突后,使用git add
命令将解决后的文件标记为已解决,然后使用git cherry-pick --continue
命令继续应用提交。
此外,git cherry-pick
会在当前分支上创建新的提交,因此在执行此操作之前,请确保已经保存并提交了重要的更改。
要修改之前的提交记录而不影响后续提交,可以使用git commit --amend
命令或者使用交互式 rebase。
以下是两种方法的说明:
使用git cherry-pick
命令:
git log
命令查看提交记录,并找到要修改的提交的哈希值(commit hash)。git cherry-pick -n
命令,将
替换为要修改的提交的哈希值。使用-n
选项可以将提交应用到当前分支上,但不会自动创建新的提交。git commit --amend
命令修改提交记录。这将打开一个文本编辑器,允许你修改提交消息或进行其他修改。git cherry-pick --continue
命令继续应用提交。这将创建一个新的提交,包含修改后的提交记录。请注意,使用git cherry-pick
和git commit --amend
修改提交记录时,可能会发生冲突。如果发生冲突,需要手动解决冲突后,使用git add
命令将解决后的文件标记为已解决,然后使用git cherry-pick --continue
命令继续应用提交。
此外,修改提交记录后,应该避免对已经推送到远程仓库的提交进行修改,以免引起问题。如果已经推送到远程仓库,应该谨慎处理,并与团队成员协商。
使用交互式 rebase
:
git log
命令查看提交记录,并找到要修改的提交的哈希值(commit hash)。git rebase -i
命令,将
替换为要修改的提交的哈希值。pick
关键字替换为edit
。git commit --amend
命令修改提交消息或者进行其他修改。git rebase --continue
命令继续 rebase
过程,并将修改后的提交应用到之前的提交上。请注意,使用交互式 rebase
修改提交记录时,可能会发生冲突。如果发生冲突,需要手动解决冲突后,使用git add
命令将解决后的文件标记为已解决,然后使用git rebase --continue
命令继续 rebase
过程。
无论使用哪种方法,修改提交记录后,应该避免对已经推送到远程仓库的提交进行修改,以免引起问题。如果已经推送到远程仓库,应该谨慎处理,并与团队成员协商。
当你在Git仓库中达到一个重要的里程碑或版本时,你可以使用Git标签(tag)来标记这个特定的提交。标签可以帮助你在代码库中快速找到特定的版本,也可以用于发布软件版本。
以下是一些关于Git标签的常用命令和知识:
创建标签:
git tag []
,如果不指定
,默认指向HEAD
所指向的位置git tag -a -m "说明"
查看标签:
git tag
git show
删除标签:
git tag -d
git push origin :refs/tags/
推送标签:
git push origin
git push origin --tags
切换到标签所在的提交:
git checkout
列出标签所在的提交:
git rev-list
标签的类型:
请注意,标签是与提交相关联的,而不是与分支相关联的。这意味着,即使你在一个分支上创建了一个标签,切换到另一个分支后,标签仍然会存在。
git describe
是一个用于描述当前所在提交的命令。它主要用于提供一个更具描述性的标识符,以便更好地理解当前所在的提交相对于最近的标签或分支。
基本用法:
git describe
:返回当前所在提交的描述符。git describe
:返回指定提交的描述符。描述符的格式:
--g
:如果当前提交是一个标签,那么描述符将直接是标签名。如果当前提交不是一个标签,那么描述符将由最近的标签名、当前提交与最近的标签之间的提交数以及当前提交的哈希值组成。选项:
--abbrev=
:指定哈希值的缩写长度,默认为7。--tags
:只考虑标签,忽略其他引用(如分支)。--exact-match
:只返回完全匹配的标签。示例:
git describe
:返回当前所在提交的描述符。git describe --tags
:只考虑标签,返回当前所在提交相对于最近的标签的描述符。git describe HEAD~3
:返回HEAD的第3个父提交的描述符。git describe
的主要用途是为当前提交提供一个更具描述性的标识符,以便更好地理解当前所在的提交相对于最近的标签或分支。它在软件版本控制和发布过程中特别有用。
远程仓库并不复杂, 在如今的云计算盛行的世界很容易把远程仓库想象成一个富有魔力的东西, 但实际上它们只是你的仓库在另个一台计算机上的拷贝。你可以通过因特网与这台计算机通信 —— 也就是增加或是获取提交记录
话虽如此, 远程仓库却有一系列强大的特性
现在用网站来对远程仓库进行可视化操作变得越发流行了(像 Github 或 Phabricator), 但远程仓库永远是这些工具的顶梁柱, 因此理解其概念非常的重要!
添加远程仓库:
git remote add
git remote -v
克隆远程仓库:
git clone
推送和拉取:
git push
git pull
查看远程仓库信息:
git remote show
git branch -r
删除远程仓库:
git remote remove
远程仓库的重命名和修改:
git remote rename
git remote set-url
远程分支操作:
git checkout -b /
git branch -d
远程仓库的同步:
git fetch
git merge /
远程仓库是多人协作和代码共享的重要工具。通过与远程仓库的交互,开发者可以方便地进行代码的共享、同步和合作。
参考: