Git协作
文章目录
- Git协作
- 冲突
- 冲突的发生情况
- 解决冲突
- 如何处理冲突
- 1 分支
- 1.1 什么是Git分支
- 1.2 创建分支
- 2 切换分支
- 2.1 指向分支
- 2.2 暂存分支
- 切换分支与未提交更改的处理
- 使用 Stash 临时保存更改
- Stash 的工作原理:
- 场景设定
- 使用 Git Stash
- 3 远程分支
- 3.1 快进合并
- 快进合并的工作机制
- 快进合并的场景
- 非快进合并
- 快进合并的影响
- 3.2 拉取(git pull)
- 3.3 获取(git fetch)
- `git fetch` vs. `git pull`
- 具体使用示例
- 3.4 推送(git push)
- 4 分支的工作流程
- 1. 主分支(Main Branch)
- 2. 功能分支(Feature Branches)
- 3. 发布分支(Release Branches)
- 4. 修补分支(Hotfix Branches)
- 5. 开发分支(Development Branch)
- 4.1 主分支
- 4.2 功能发布
- 4.3 发布分支
- 4.4 修补分支
- 4.5 开发分支
- 4.6 Git分支工作流程示例
- 分支策略工作流程步骤详解
- 1. **发现生产中的Bug**
- 2. **创建Bug修复分支**
- 3. **修复Bug并合并**
- 4. **返回到功能分支**
- 5. **同步开发分支的更改**
- 6. **使用变基进行同步**
- 7. **继续功能开发**
- 5 整合分支
- 5.1 合并分支
- 5.2 将分支变基
- 6 标签
- 7 查看变更
- 其他
- git status
- git log
- 总结
Git协作
冲突
在版本控制系统中,特别是在使用Git时,冲突(Conflict)指的是当多个团队成员对同一个文件的相同部分进行更改并尝试合并这些更改时发生的问题。冲突通常出现在合并分支、重基(rebase)操作或应用补丁时,因为这些操作涉及将一个分支的更改整合到另一个分支上。
冲突的发生情况
冲突发生的典型情况包括:
-
编辑冲突:
两个或更多开发者修改了同一个文件的同一部分。例如,如果开发者A删除了一个函数,而开发者B在同一函数中添加了一些新代码,当这两个分支合并时,Git无法自动决定哪个版本是正确的。 -
文件冲突:
一个开发者修改了一个文件,而另一个开发者删除了同一个文件,或两个开发者重命名/移动了同一个文件但目标不同。
解决冲突
当冲突发生时,Git会标记冲突的文件,并在文件内容中插入特定的标记,指示冲突的位置。这些标记分为以下几部分:
- 开始冲突标记
<<<<<<<
:此标记后跟的是当前分支的内容。 - 分隔符
=======
:分隔当前分支内容和其他分支的内容。 - 结束冲突标记
>>>>>>>
:此标记后跟的是合并进来的分支的内容。
例如,如果在两个分支上对同一文件的同一行进行了不同的更改,Git无法自动合并,文件将包含类似以下内容:
<<<<<<< HEAD
console.log("This is the version in the current branch.");
=======
console.log("This is the version in the branch being merged.");
>>>>>>> feature-branch
如何处理冲突
解决冲突通常涉及以下步骤:
-
识别冲突:
使用git status
查看哪些文件存在冲突。 -
手动编辑文件:
打开冲突文件,查看冲突标记,并决定保留哪个版本的更改,或者可能合并这两个版本的更改。 -
标记文件为已解决:
解决完冲突后,使用git add <file>
命令将文件标记为已解决。这告诉Git您已经手动解决了这些冲突。 -
完成合并:
一旦所有冲突都被解决并标记,完成合并过程,通常是通过git commit
命令。通常,Git会提供一个默认的合并提交消息,确认即可。
处理冲突需要细致的注意力,确保合并后的结果符合预期,同时保持代码的功能和完整性。在团队环境中,有效的沟通和代码审查可以大大减少冲突的发生。
1 分支
1.1 什么是Git分支
在处理不同任务的时候开不同的分支,把不同的任务区别开
多个不同的分支可以合并成一个分支,各个分支互不影响,除非拉取新的更改
为每个任务创建分支是个值得采用的做法,可以更好的追溯变更。
1.2 创建分支
创建新的分支不会更改存储库,只是指出了提交。如下图所示,使用 git branch 命令创建一个名为issue1
的分支,存储库将保持不变,只是为当前提交添加了一个新指针。
2 切换分支
git checkout 命令可更新工作树中的文件,以匹配存储在您希望切换到的分支中的版本。类似于切换目录或者工作区。
2.1 指向分支
- HEAD 用于表示分支的当前快照。对于一个新的存储库,在默认情况下,Git 会将 HEAD 指向主分支。更改 HEAD 指向的位置将更新您的活动分支。
- (代字号) 和 ^ (插入符号) 指向相对于特定提交的位置。这些符号与提交引用一起使用,通常是 HEAD 或提交哈希(hash)。
- ~ 指的是祖先 (多少代取决于~后的数字)。
- HEAD~1 指的是提交的第一个父级。
- HEAD~2 指的是提交的第一个祖父级。
- ^ 指的是合并提交的父级。
- HEAD^1 指的是 HEAD 的第一个父级,其中 head 是合并提交。
- HEAD^2 指的是 HEAD 的第一个祖父级,其中 head 是合并提交。
合并提交中的提交可以有多个父项。
2.2 暂存分支
当您在使用Git进行版本控制时,可能会遇到需要在多个分支之间切换的情况,同时又希望保留未提交的更改。这时,Git提供了一些策略来处理这些未提交的更改,以便您可以无碍地在不同分支间进行工作。
切换分支与未提交更改的处理
-
基本行为:
- 当您在工作树中有未提交的更改(包括新文件、修改或删除的文件)时,这些更改可以被带到新分支上,前提是不会与新分支的文件产生冲突。
- 如果您提交了这些更改,它们将仅存在于您切换到的新分支上。
-
冲突防止切换:
- 如果存在冲突(即,当前分支的未提交更改与目标分支的文件内容不兼容),Git不会允许您直接切换分支。这是为了防止潜在的代码丢失。
使用 Stash 临时保存更改
为了解决在分支间切换时带来的问题,Git 提供了一个称为 stash
的功能,允许您临时存储未提交的更改,以便您可以清洁地切换到其他分支继续工作。
Stash 的工作原理:
-
存储更改:
使用git stash
或git stash push
命令将当前工作树中的更改保存起来,这样您的工作树就回到了干净的状态(如同刚刚克隆仓库后的状态)。git stash
-
列出存储的更改:
可以通过git stash list
查看所有存储的更改条目。git stash list
-
恢复更改:
当您需要恢复之前存储的更改时,可以使用git stash pop
(应用最近的更改并从stash列表中移除它)或git stash apply
(应用更改但保留在stash列表中)。git stash pop
-
让我们通过一个具体的例子来说明如何使用
git stash
来管理工作区中未提交的更改,使您能够在不同的分支之间灵活切换。场景设定
假设您正在开发一个新功能,在分支
feature-x
上工作。在您开发的过程中,突然接到通知需要立刻解决主分支main
上的一个紧急bug。此时,您的工作区有未提交的更改,这些更改还不够稳定,不能直接提交。同时,您需要切换到
main
分支来修复bug。使用 Git Stash
-
保存当前更改
在您的feature-x
分支上,使用以下命令将所有未提交的更改(包括暂存和未暂存的)存入stash:git stash push -m "WIP: Feature X adjustments"
这里的
-m
选项允许您为stash项添加一个描述性消息,便于以后识别和恢复。 -
查看Stash列表
输入以下命令查看当前保存的stash项:git stash list
这会显示所有stash项,包括您刚刚添加的。
-
切换到主分支
清理了工作区后,您现在可以安全地切换到main
分支:git checkout main
-
进行紧急修复
在main
分支上进行必要的更改并提交。这可能包括测试、修改和提交修复:git add . git commit -m "Fix critical bug in main"
-
切换回功能分支
修复完成后,切换回您的功能分支:git checkout feature-x
-
恢复之前的工作
使用以下命令将之前stashed的更改重新应用到工作区:git stash pop
这将应用最近的stash项并从stash列表中删除它。
-
3 远程分支
3.1 快进合并
在Git中,快进合并(fast-forward merge)是一种特殊类型的合并,它发生在当一条分支可以直接前进到另一条分支的末端时,无需进行任何实际的合并操作。这种情况通常发生在没有新的并行提交影响这两个分支的情况下,即当前分支的末端提交是要合并分支的基础上直接发展出来的提交。
快进合并的工作机制
-
简化的视图:
当一个分支的所有提交都在另一个分支的直接历史线上时,就可以进行快进合并。这意味着可以简单地将接收分支的指针(HEAD)前移到源分支的最新提交,而不需要创建一个新的合并提交。 -
没有分支点:
快进合并不会创建一个新的合并提交,因为它仅仅涉及指针的移动。这样做保持了项目历史的线性和简洁。
快进合并的场景
假设您有两个分支:main
和 feature
。feature
分支从main
分支分出来,main
分支在此期间没有新的提交,而feature
分支有若干提交。当你决定将feature
分支合并回main
分支时:
-
操作:
git checkout main git merge feature
-
结果:
如果main
分支在feature
分出后没有新的提交,Git会执行快进合并,直接将main
分支的HEAD指针移动到feature
分支的最新提交。这样,main
分支现在包含了所有feature
分支的更改。
非快进合并
相对于快进合并,非快进合并发生在当目标分支自分支点以来有新的提交时,即两个分支都有各自独立的提交。在这种情况下,Git无法简单地进行指针前移,因为这样会丢失目标分支上的更改。
-
操作:
如果你想确保即使可以进行快进合并也要创建一个新的合并提交,可以使用--no-ff
选项:git merge --no-ff feature
-
结果:
这将强制Git创建一个新的合并提交,即使是快进合并也不例外。这样做可以保留分支信息和合并历史。
快进合并的影响
快进合并的优点是保持了历史的清洁和线性,但在某些情况下,保留分支的合并历史(非快进合并)可能更有助于了解项目历史的结构和重要决策。选择使用哪种合并策略取决于团队的偏好和项目的特定需求。
3.2 拉取(git pull)
您可以使用 git pull 命令将远程存储库中的最新更改应用到本地存储库。
例如,假设远程分支位于本地分支的上游。远程分支将包含本地分支的所有更改,如下所示。
- 远程分支在本地分支的上游。
在这种情况下,如果我们要将远程分支 (origin/main) 的合并应用到我们的本地分支 (main),这将是一个快进合并。
但是如果本地 main 分支中的更改不存在于远程 origin/main 分支中,则拉取命令将执行合并,且将创建将这些更改绑定在一起的合并提交。
- 如果本地分支与远程分支不同,Git 必须在拉取之前合并和提交。
执行拉取时,会在本地存储库中自动创建合并提交。如果存在冲突,您将必须解决冲突并手动提交合并。
如果没有冲突,提交将自动合并。
3.3 获取(git fetch)
只要没有冲突,在执行拉取时,来自远程分支的更改会自动合并到您当前的本地分支。如果您想获取远程的修改但又不想将它们合并到您当前的本地分支中,您可以执行 git fetch 命令。
获取将从远程下载本地分支上尚不存在的更改。获取FETCH_HEAD ref
将跟踪从远程存储库中获取的更改。
当远程和本地分支都包含不同的后代时,修订历史记录将如下所示:
远程和本地分支具有不同 main 时的修订历史记录。
更改获取后,您可以通过合并获取_HEAD 或执行拉取将这些更改应用到本地存储库。
合并后,更改将应用于本地存储库。
一旦获取FETCH_HEAD
合并,修订历史记录将产生与git pull
操作相同的结果。拉取是同时执行获取和合并操作。
git fetch
vs. git pull
-
git fetch
- 用途:
git fetch
仅仅从远程仓库下载到本地仓库中尚不存在的更改,但不会自动合并或修改您的当前工作。 - 结果:执行
git fetch
后,您的本地仓库将包含远程仓库的最新更改,但这些更改不会影响您的任何工作分支,除非您显式合并它们。 - 修订历史:
FETCH_HEAD
是一个特殊的引用,它指向刚刚从远程仓库获取的最新提交。
- 用途:
-
git pull
- 用途:
git pull
是git fetch
和git merge
的组合。它不仅下载最新的远程更改,还会尝试将这些更改合并到当前分支中。 - 结果:如果合并成功(没有冲突),您的当前分支将自动更新以包括远程分支的更改。
- 修订历史:如果合并成功,您的本地分支修订历史将包括这些远程更改。
- 用途:
具体使用示例
(1)使用 git fetch
检查远程更改
假设您正在本地的 master
分支上工作,并想查看远程仓库(如 origin
)中的更新,但不立即合并这些更改:
git fetch origin
执行此命令后,您可以使用以下命令检查远程分支的状态而不影响您的本地分支:
git log --oneline master..origin/master
这会显示从远程 master
分支获取的提交,这些提交还没有被合并到您的本地 master
分支。
(2) 合并 FETCH_HEAD
如果您决定要将这些更改合并到您的本地分支,可以使用:
git merge FETCH_HEAD
这会将从 git fetch
获取的更改合并到您当前的分支中。
(3)使用 git pull
直接更新和合并
如果您确定要立即获取并合并远程分支的更改,可以直接使用:
git pull origin master
这条命令等同于先执行 git fetch origin master
然后执行 git merge origin/master
。
3.4 推送(git push)
在将本地分支推送到远程存储库之前,所有提交都可用。换句话说,您可以按照自己的节奏在本地分支工作,而不会影响其他团队成员。
当您将本地分支推送到远程时,Git 将快进合并到目标存储库。
但是,如果推送导致非快进合并,Git 将拒绝您的推送以防止您覆盖以前的提交。在这种情况下,您必须拉取最新的远程更改并再次推送。
4 分支的工作流程
在成功的Git分支模型中,提到的五种分支类型,每种都具有特定的作用和管理规则。这些分支类型协助团队在不同的开发阶段进行组织和管理,确保软件开发流程的清晰性和效率。以下是对这些分支的概述和整理:
1. 主分支(Main Branch)
- 别称:
master
或main
- 用途: 包含生产环境中的代码,始终保持稳定且可部署。
- 特点: 通常用于合并其他分支的成果,如新功能、修补或发布准备。不直接在此分支上进行日常工作。
2. 功能分支(Feature Branches)
- 别称: 主题分支
- 用途: 用于开发新功能或实验,每个分支通常源自主分支或开发分支,并最终合并回去。
- 特点: 提供了一个隔离的环境,允许开发者在不影响主分支稳定性的情况下工作,便于代码审查和管理。
3. 发布分支(Release Branches)
- 用途: 用于准备即将发布的版本。从开发分支(如
develop
)分出,进行最后的测试和微调。 - 特点: 主要处理bug修复、文档生成和其他发布任务。一旦版本准备就绪并确认可以发布,发布分支将合并到主分支和开发分支中,随后关闭。
4. 修补分支(Hotfix Branches)
- 用途: 快速修复生产环境中的紧急问题。这些分支从主分支分出,并在问题解决后立即合并回主分支和开发分支。
- 特点: 旨在迅速解决生产中的关键问题,确保对正在进行的开发活动的干扰最小。
5. 开发分支(Development Branch)
- 别称: 集成分支,通常命名为
develop
- 用途: 包含所有为下一版本准备好的功能,是功能分支合并的目标。
- 特点: 在发布周期的大部分时间内保持活跃,用于集成即将发布的功能。在发布前,通常会从中创建一个发布分支。
这些分支策略提供了清晰的结构框架,帮助团队高效管理复杂的开发流程,优化协作和交付速度。根据项目和组织的需求,团队可以对这些策略进行调整,以最适合自己的工作方式。
4.1 主分支
在存储库中进行第一次提交时,默认情况下 Git 会自动创建一个主分支。随后的提交将在主分支下进行,直到您决定创建并切换到另一个分支。
驻留在主分支的代码库是生产就绪的。当最新的提交准备好用于特定版本时,它将被赋予一个发布标签。
4.2 功能发布
当您开始处理新功能或 bug 修复时,您应该创建一个功能分支 (即主题分支)。功能分支通常是在开发分支之外创建的。在功能的整个开发生命周期中,该主题分支可以驻留在您的本地机器中。
每当您准备好将变更集与开发分支合并时,您将把这个分支推送到远程存储库。
4.3 发布分支
当您推出新版本时,您会创建一个发布分支。发布分支可帮助您确保新功能的正常运行。
按照惯例,在命名发布分支时以前缀release-
开头。
通常当它接近生产就绪时,您会在开发分支之外创建发布分支。
团队成员应仅解决此分支上的 bug 修复和与发布相关的问题。这允许其他团队成员继续将新功能推送到开发分支,而不会中断发布的工作流程。
准备发布时,将发布分支与主分支合并,并为新创建的合并提交标记发布编号。
您还应该将发布分支与开发分支合并,以便主分支和开发分支都可从发布分支接收最新的更改/bug 修复。
4.4 修补分支
当您需要快速向生产代码库添加关键修复时,您可以在主分支之外创建一个修补分支。
按照惯例,在命名修补分支时以前缀hotfix-
开头。
修补分支的优点是它允许您快速发布补丁,并将更改与主分支合并,而无需等待下一个版本。
修补分支也应该与开发分支合并。
4.5 开发分支
您的团队应该始终保持开发分支 (即集成分支) 的稳定。您的团队从这个分支创建新的分支,它可以在生产环境中运行。持续集成工具,例如 Jenkins 可以做到这一点。
当一些更改需要合并到开发分支时,创建一个功能/分支来处理通常是个好主意。
4.6 Git分支工作流程示例
在这个Git分支策略工作流程示例中,我们通过处理一个实际场景来阐明如何在开发新功能的同时快速响应并修复生产中的bug。这种分支策略有效地结合了开发/集成分支和功能/主题分支的使用,确保开发流程的连续性和灵活性。
分支策略工作流程步骤详解
1. 发现生产中的Bug
- 在开发新功能的同时,生产环境中出现了一个bug。为了不干扰当前的功能开发,需要创建一个专门的bug修复分支。
2. 创建Bug修复分支
- 从开发分支(通常是
develop
)分出一个新的分支来专门处理这个bug。这保证了bug修复工作与功能开发工作的隔离。
3. 修复Bug并合并
- 在这个新的bug修复分支上进行工作,一旦完成修复,就将这个分支合并回开发分支。这一步确保所有的bug修复都会反映到主要的开发线上。
4. 返回到功能分支
- 修复完bug后,切换回原先的功能分支继续新功能的开发。
5. 同步开发分支的更改
- 开发新功能时,您可能需要刚刚合并到开发分支上的修复。这需要您将开发分支的更改(包括bug修复)整合到您的功能分支上。
- 您可以通过以下两种方式来实现:
- 合并(Merge):将开发分支合并到您的功能分支,这将保留两个分支的历史。
- 变基(Rebase):将您的功能分支变基到最新的开发分支上。这使得历史更为线性,好像您是在最新的开发状态基础上开始添加新功能。
6. 使用变基进行同步
- 选择使用变基来更新您的功能分支,这样您的分支看起来就像是直接基于最新的开发分支开始的。这样可以使项目历史更清晰,也更易于理解。
7. 继续功能开发
- 完成变基后,您的功能分支现在包含了必要的bug修复。您可以继续开发新功能,确保所依赖的代码是最新且稳定的。
5 整合分支
- 合并方法:保留合并分支的所有更改和历史记录。多次合并后,修订历史记录可能会变得复杂。
- 变基方法:维护一个干净的修订历史记录,因为合并的提交会附加在目标分支的末尾。与合并的方法相比,冲突可能更频繁地发生。
为了使您的修订历史记录保持简洁,您可以在将功能分支合并到开发分支之前,将功能分支变基。这会导致快进合并,而不会创建额外的合并提交。
5.1 合并分支
您可以使用 git merge 指令来将多个分支集成。
考虑下面的情况。有两个分支:一个bugfix
分支,其中有一些来自main
分支的提交。
在这种情况下,将“bugfix“合并回“主要“分支并不是什么大问题。那是因为自从创建“bugfix”分支以来,“主要“分支没有改变。Git 将通过将“主要“分支位置移动到“bugfix“分支的最新位置来合并它。这种合并称为“快进“。
然而,在下面的示例中,自从bugfix
分支出来后,main
分支已经更新了几次。在这两个分支上执行合并时,必须组合来自bugfix
和main
分支的更改。
对于这种合并,创建一个“合并提交“并将“主要“位置更新为新创建的合并提交。
即使快进合并是可能的,您仍然可以明确地强制它在没有快进合并的情况下进行合并。
如上所示,非快进合并保留了bugfix
分支。这让您更清楚地了解功能分支bugfix
。您可以轻松找到功能分支的开始或结束位置,并跟踪对功能分支所做的更改。
5.2 将分支变基
要获得更清晰的修订历史记录,您可以使用 git rebase 命令来整合您的分支。
假设我们有两个具有非快进合并场景的分支。
变基将导致分支历史记录看起来类似于下面的示例。
当您将bugfix
分支变基到主分支时,来自bugfix
分支的提交将被重播并附加到主分支的末尾。结果是bugfix
分支历史记录中的单个简单提交串流。
如果在附加提交时发生冲突,Git 会要求您解决冲突,然后再继续对其他提交进行变基。
变基不会移动main
的位置。在任何情况下,您都可以在变基后进行快进或从bugfix
到main
的干净合并。
6 标签
Git 标签标记并标记历史记录中的特定提交。标签通常用于指示发布版本,发布名称 (即 v1.0) 是标签的名称。
Git 标签有两种类型:
- 轻量标签
- 附注标签
轻量标签类似于不会改变的分支。它只是直接指向历史记录中的特定提交。轻量标签主要在您的本地工作区中暂时使用。
附注标签是校验和的,通常在计划标记重要提交时使用。您可以添加消息、签名、日期以及标记者的姓名和电子邮件。
7 查看变更
(1)git diff
用途:git diff
命令用于显示工作目录中未暂存的文件修改和暂存的文件修改之间的差异,或比较两个提交之间的差异。
功能详解:
-
未暂存的变更:
git diff
默认显示工作目录中所有未暂存的变更。git diff
-
暂存的变更:使用
git diff --staged
或git diff --cached
查看已暂存的变更。git diff --staged
-
两个提交之间的差异:指定两个提交的哈希值来查看它们之间的差异。
git diff commit1 commit2
(2)git show
用途:git show
命令用于显示一个对象(通常是提交)的类型、大小、内容等信息。
功能详解:
-
查看特定提交:显示单个提交的详细信息,包括提交的差异和元数据。
git show [commit-hash]
(3)git log
用途:git log
命令用于查看提交历史记录,可以与不同的选项组合使用,以查看特定的历史变更。
功能详解:
-
查看特定文件的提交历史:显示指定文件的提交历史,包括相关的更改。
git log -p [filename]
-
图形化显示分支合并历史:使用图形选项查看更直观的分支历史。
git log --graph --oneline --all
(4)git blame
用途:git blame
命令用于显示每一行文件的最后修改者信息,非常有用于追踪特定行的变更历史。
功能详解:
-
查看文件修改者:逐行显示文件的修改记录,包括提交哈希和作者。
git blame [filename]
其他
git status
和 git log
是两个基本的 Git 命令,它们在日常 Git 使用中扮演着不同的角色。这两个命令提供的信息有着根本的区别,分别关注当前工作区的状态和项目的提交历史。
git status
用途:git status
命令用于显示 Git 工作目录和暂存区的状态。它是诊断和解决代码中状态相关问题的首选工具。
主要功能:
- 显示哪些文件处于修改状态(已修改但未暂存)。
- 显示哪些文件已暂存待提交(已修改并已暂存)。
- 显示当前工作目录与指定分支(通常是当前分支)的差异。
- 提示如何暂存或取消暂存更改,以及如何回滚对文件的修改。
- 提供当前分支和其上游分支的同步状态(前提是设置了上游分支)。
输出示例:
On branch main
Your branch is up to date with 'origin/main'.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: example.txtChanges not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: readme.mdUntracked files:(use "git add <file>..." to include in what will be committed)sample.txt
git log
用途:git log
命令用于显示当前分支的提交历史。它可以帮助开发者回顾和审查项目的发展过程。
主要功能:
- 显示提交历史,包括提交的哈希值、作者、日期和提交消息。
- 可以通过各种选项来定制显示的日志,如日期范围、作者、文件更改历史等。
- 支持图形化显示历史,通过
--graph
选项展示分支合并历史。
输出示例:
commit fa3e98197e714dbf123681f6927a05538db6aa56 (HEAD -> main, origin/main, origin/HEAD)
Author: John Doe <john@example.com>
Date: Wed Sep 15 14:56:29 2021 +0200Add new featurecommit aea57694cd1bfeda98234aeccc8ae202b58db2b4
Author: Jane Smith <jane@example.com>
Date: Tue Sep 14 12:48:53 2021 +0200Update README.md
总结
- git status 用于查看工作目录和暂存区的当前状态,是了解当前工作进度和状态的最直接的工具。
- git log 用于查看提交历史,帮助你了解项目的版本历史和过去的开发活动。
这两个命令在日常的 Git 使用中非常关键,为开发者提供了关于项目状态和历史的重要信息。
相关文章:

Git协作
文章目录 Git协作冲突冲突的发生情况解决冲突如何处理冲突 1 分支1.1 什么是Git分支1.2 创建分支 2 切换分支2.1 指向分支2.2 暂存分支切换分支与未提交更改的处理使用 Stash 临时保存更改Stash 的工作原理:场景设定使用 Git Stash 3 远程分支3.1 快进合并快进合并的…...

Three.js机器人与星系动态场景(四):封装Threejs业务组件
实际在写业务的时候不会在每个组件里都写几十行的threejs的初始化工作。我们可以 将通用的threejs的场景、相机、render、轨道控制器等进行统一初始化。同时将非主体的函数提到组件外部,通过import导入进组件。将业务逻辑主体更清晰一些。下面的代码是基于reactthre…...

亚马逊云科技 Amazon Bedrock 构建 AI 应用体验
前言 大模型应用发展迅速,部署一套AI应用的需求也越来越多,从头部署花费时间太长,然而亚马逊科技全托管式生成式 AI 服务 Amazon Bedrock,Amazon Bedrock 简化了从基础模型到生成式AI应用构建的复杂流程,为客户铺设了…...

程序员标准简历模板
链接: https://pan.baidu.com/s/1yMXGSSNba15b9hMXjA39aA?pwdb4ev 提取码: b4ev 3年工作经验简历 链接: https://pan.baidu.com/s/1OO7n1lRL6AkhejxYC9IyDA?pwdfmvv 提取码: fmvv 优秀学员简历 链接: https://pan.baidu.com/s/106Vkw_ulOInI47_5mDySSg?pwduudc 提取码: uu...

物联网设计竞赛_10_Jetson Nano中文转汉语语音
在windows中pyttsx3可以让汉字文本输出中文语音,但是在jetson上只能用英文说话 import pyttsx3def hanyu(test):engine pyttsx3.init()rate engine.getProperty(rate)engine.setProperty(rate,125)engine.say(test)engine.runAndWait() hanyu(你好) #engine.save…...

XML Schema 指示器
XML Schema 指示器 1. 引言 XML Schema 是一种用于定义 XML 文档结构和内容的语言。它提供了一种强大的方式来描述 XML 文档中允许的元素、属性和数据类型。XML Schema 指示器是在 XML Schema 定义中使用的一些特殊元素和属性,它们用于指示 XML 处理器如何解析和验证 XML 文…...

iOS UITableView自带滑动手势和父视图添加滑动手势冲突响应机制探索
场景 我们有时候会遇到这样的一个交互场景:我们有一个UITableView 放在一个弹窗中,这个弹窗可以通过滑动进行展示和消失(跟手滑动的方式),然后这个UITableView放在弹窗中,并且可以滚动,展示一些…...

RAG实践:ES混合搜索BM25+kNN(cosine)
1 缘起 最近在研究与应用混合搜索, 存储介质为ES,ES作为大佬牌数据库, 非常友好地支持关键词检索和向量检索, 当然,支持混合检索(关键词检索向量检索), 是提升LLM响应质量RAG(Retri…...

论文去AIGC痕迹:避免AI写作被检测的技巧
在数字化时代,AI正以其卓越的能力重塑学术写作的面貌。AI论文工具的兴起,为研究者们提供了前所未有的便利,但同时也引发了关于学术诚信和原创性的热烈讨论。当AI辅助写作成为常态,如何确保论文的独创性和个人思想的体现࿰…...

C#使用异步方式调用同步方法的实现方法
使用异步方式调用同步方法,在此我们使用异步编程模型(APM)实现 1、定义异步委托和测试方法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Task…...

【Go系列】 Go语言的入门
为什么要学习Go 从今天起,我们将一同启程探索 Go 语言的奥秘。我会用简单明了的方式,逐一讲解 Go 语言的各个知识点,帮助你从基础做起,一步步深化理解。不论你之前是否有过 Go 语言的接触经验,这个系列文章都将助你收获…...

Dify 与 Xinference 最佳组合 GPU 环境部署全流程
背景介绍 在前一篇文章 RAG 项目对比 之后,确定 Dify 目前最合适的 RAG 框架。本次就尝试在本地 GPU 设备上部署 Dify 服务。 Dify 是将模型的加载独立出去的,因此需要选择合适的模型加载框架。调研一番之后选择了 Xinference,理由如下&…...

MICCAI 2024Centerline Boundary Dice Loss for Vascular Segmentation
MICCAI 2024 Centerline Boundary Dice Loss for Vascular Segmentation MICCAI 2024Centerline Boundary Dice Loss for Vascular Segmentation中心线边界Dice损失用于血管分割**摘要**:1. 引言相关工作: 2. 方法预备知识Dice的变化 3 实验3.1 数据集3.2 设置3.3 结…...

golang验证Etherscan上的智能合约
文章目录 golang验证Etherscan上的智能合约为什么要验证智能合约如何使用golang去验证合约获取EtherscanAPI密钥Verify Source Code接口Check Source Code Verification Status接口演示示例及注意事项网络问题无法调用Etherscan接口(最重要的步骤) golan…...

Visual Studio编译优化选项
目录 /O1 和 /O2 /Ox 内联函数 虚函数优化 代码重排 循环优化 链接时间优化 代码分割 数学优化 其他优化选项 在Visual Studio中,编译优化选项是用于提高程序性能的重要工具。编译器提供了多种优化级别和选项,可以根据不同的需要进行选择。 在…...

sql业务场景分析思路参考
1、时间可以进行排序,也可以用聚合函数对时间求最大值max(时间) 例如下面的例子:取最晚入职的人,那就是将入职时间倒序排序,然后limit 1 表: 场景:查找最晚入职员工的所有信息 se…...

Django权限系统如何使用?
Django的权限系统是一个强大而灵活的特性,允许你控制不同用户对应用程序中资源的访问。以下是使用Django权限系统的几个基本步骤: 1. 定义模型权限 在你的models.py文件中,你可以为每个模型定义自定义权限。这通过在模型的Meta类里设置perm…...

基于整体学习的大幅面超高分遥感影像桥梁目标检测(含数据集下载地址)
文章摘要 在遥感图像(RSIs)中进行桥梁检测在各种应用中起着至关重要的作用,但与其他对象检测相比,桥梁检测面临独特的挑战。在RSIs中,桥梁在空间尺度和纵横比方面表现出相当大的变化。因此,为了确保桥梁的…...

逻辑回归模型(非回归问题,而是解决二分类问题)
目录: 一、Sigmoid激活函数:二、逻辑回归介绍:三、决策边界四、逻辑回归模型训练过程:1.训练目标:2.梯度下降调整参数: 一、Sigmoid激活函数: Sigmoid函数是构建逻辑回归模型的重要激活函数&am…...

QT的OpenGL渲染窗QOpenGLWidget Class
Qt - QOpenGLWidget (class) (runebook.dev) 一、说明 QOpenGLWidget 类是用于渲染 OpenGL 图形的小部件。从Qt 5.4就开始退出,它对于OpenGL有专门的配合设计。 二、QOpenGLWidget类的成员 2.1 Public类函数 QOpenGLWidget(QWidget *parent nullptr,Qt…...

单元测试和集成测试
软件测试中,单元测试和集成测试是比较常见的方法 单元测试:这是一种专注于最小可测试单元(通常是函数或方法)的测试,用于验证单个组件的行为是否符合预期。它通常由开发者自己完成,可以尽早发现问题&#…...

【JAVA入门】Day15 - 接口
【JAVA入门】Day15 - 接口 文章目录 【JAVA入门】Day15 - 接口一、接口是对“行为”的抽象二、接口的定义和使用三、接口中成员的特点四、接口和类之间的关系五、接口中新增的方法5.1 JDK8开始接口中新增的方法5.1.1 接口中的默认方法5.1.2 接口中的静态方法 5.2 JDK9 开始接口…...

ES6 之 Set 与 Map 数据结构要点总结(一)
Set 数据结构 Set 对象允许你存储任何类型的唯一值,无论是原始值还是对象引用。 特性: 所有值都是唯一的,没有重复。值的顺序是根据添加的顺序确定的。可以使用迭代器遍历 Set。 常用方法: 1. add(value):添加一个新…...

一文学会用RKE部署高可用Kubernetes集群
k8s架构图 RKE简介 RKE全称Rancher Kubernetes Engine,是一个快速的,多功能的 Kubernetes 安装工具。通过RKE,我们可以快速的安装一个高可用K8S集群。RKE 支持多种操作系统,包括 MacOS、Linux 和 Windows。 K8S原生安装需要的先…...

数据加密的常见方法
数据加密是一门历史悠久的技术,它通过加密算法和加密密钥将明文(原始的或未加密的数据)转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。这一技术的核心是密码学,它利用密码技术对信息进行加密,实现信息隐蔽&#…...

天童美语:推荐给孩子的人文历史纪录片
孩子们都有自己的偏好,有的孩子喜欢打游戏,有的孩子喜欢看剧看电影,有的孩子喜欢看书。针对不同的孩子我们要因材施教,所以,广州天童教育给大家推荐一下适合给孩子看的人文历史类的纪录片,让精美的画面&…...

数字人技术如何推动教育事业可持续创新发展?
数字人技术作为一种新兴的教育手段,无论是幼儿园还是大学课堂,数字人都可以融入于各阶段教育中,结合动作捕捉、AI等技术,提高教育资源的利用。 AI智能交互数字人应用: 数字人结合NLP自然语言处理技术以及AI大模型技术…...

FPGA程序设计
在设计FPGA时,多运用模块化的思想取设计模块,将某一功能设计成module。 设计之前要先画一下模块设计图,列出输入输出接口,再进一步设计内部功能。 状态机要画图,确定每个状态和状态之间怎么切换。状态用localparam定…...

彻底开源,免费商用,上海AI实验室把大模型门槛打下来
终于,业内迎来了首个全链条大模型开源体系。 大模型领域,有人探索前沿技术,有人在加速落地,也有人正在推动整个社区进步。 就在近日,AI 社区迎来首个统一的全链条贯穿的大模型开源体系。 虽然社区有LLaMA等影响力较大…...

MTEB评估基准使用指北
文章目录 介绍评估数据 介绍 文本嵌入通常是在单一任务的少量数据集上进行评估,这些数据集未涵盖其可能应用于其他任务的情况,不清楚在语义文本相似性(semantic textual similarity, STS)等任务上的最先进嵌入是否同样适用于聚类或…...