Git命令¶
git clone¶
从远程拉取代码
- 先在本地创建一个文件夹
- 终端cd进入该文件夹
- git clone 远程仓库的路径
clone某一次commit¶
克隆Git仓库的特定提交,需要先克隆整个仓库,然后使用checkout
命令切换到特定的提交。以下是步骤:
- 克隆整个仓库:
git clone <repository-url>
- 切换到你的目标仓库:
cd <repository-name>
- 使用
checkout
命令切换到特定的提交。你需要知道想要切换的提交的哈希值:
git checkout <commit-hash>
注意,当切换到一个特定的提交时,你会处于一个"DETACHED HEAD"状态。这意味着任何你做的改变都不会影响任何分支。如果你想要保存你的改变,你可以创建一个新的分支。
如果你想要创建一个新的分支来保存你所做的提交,你可以使用git switch -c <new-branch-name>
命令来创建。你也可以随时使用这个命令。
如果你想撤销这个操作,你可以使用 git switch -
命令来回到你之前的状态。
如果你不想再看到这个提示,你可以通过设置配置变量advice.detachedHead
为false
来关闭它。例如,运行 git config --global advice.detachedHead false
。
git add .¶
添加到缓存。
.
表示添加目录下所有文件到缓存库。 .
和add
之间有空格。
如果只添加某个文件,只需把 .
换成要添加的文件名即可。
git status¶
可以查看哪些文件修改了或者冲突了。
命令的输出十分详细
git status --short或git status -s 格式更为紧凑的输出。
git commit -m "注释"¶
本地提交,将缓存中的文件Commit到git库。
git push¶
git push origin master。提交到远程的master分支。
git push <远程主机名> <分支名>
git pull¶
拉取/同步远程仓库的代码到本地,更新代码。
tag¶
git tag
:查看所有tag。
git tag 0.1.0
:打tag。
git push --tags
:提交tag到远程。
branch¶
列出分支基本命令:git branch
。
没有参数时,git branch 会列出你在本地的分支。
$ git branch
* master
此例的意思就是,有一个 master 分支,并且该分支是当前分支。
创建分支¶
执行 git branch (branchname) 即可。
$ git branch testing
$ git branch
* master
testing
checkout¶
git checkout (BranchName) 切换到要修改的分支。
merge¶
本地合并,解决冲突,提交,推送。
git merge --no-ff '3.3.0'
:将3.3.0分支合并到当前分支。
git fetch origin
//先切换到主分支
git checkout 'main'
//将3.3.2分支合并到main分支,并且会创建一个新的合并提交,即使可以进行快速前进合并。
git merge --no-ff '3.3.2'
//将目标分支推送到 GitLab。
git push origin 'main'
其中 --no-ff
选项的作用是强制执行非快速前进(non-fast-forward)合并。
详细解释
- 快速前进合并(Fast-Forward Merge):
- 如果目标分支(例如
main
)直接位于源分支(例如feature
)的历史之前,Git 默认会执行快速前进合并。这种合并方式不会创建新的合并提交,只是简单地将目标分支的指针移动到源分支的最新提交。 -
快速前进合并不会保留分支的合并历史,合并后的提交历史看起来像是线性的。
-
非快速前进合并(Non-Fast-Forward Merge):
- 使用
--no-ff
选项时,即使可以进行快速前进合并,Git 也会创建一个新的合并提交。这种方式会保留分支的合并历史,明确显示合并点。 - 这样做的好处是可以更好地记录分支的合并过程,便于以后查看历史和理解代码的演变。
示例
假设你有以下分支结构:
A---B---C (main)
\
D---E (feature)
如果你在 main
分支上执行 git merge feature
:
- 默认(快速前进):
-
结果是
main
分支直接移动到E
,提交历史变为:A---B---C---D---E (main)
-
使用
--no-ff
: -
结果是创建一个新的合并提交
M
,提交历史变为:A---B---C---M (main) / \ D---E
使用 --no-ff
可以更清晰地记录分支合并的历史,尤其在团队协作或复杂项目中,这种记录方式可以帮助更好地理解代码的演变过程。
冲突解决¶
选中冲突的文件,点击右键选择'冲突解决'菜单中的选项解决问题。
拉取代码报错¶
From git.nmy.cn:app/003Code/ios-scm
\* branch main -> FETCH_HEAD
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.
这个错误信息表明你的本地分支和远程分支已经发散,它们拥有不同的提交历史,Git 需要知道如何合并这些更改。这通常发生在其他人已经推送了一些提交到远程仓库的 main
分支,而你的本地 main
分支也有一些不同的提交。Git 不确定应该如何合并这些更改,所以它需要你提供一个策略来解决这个问题。
Git 提供了几种策略来解决这个问题:
- 合并(Merge):这会创建一个新的合并提交,它结合了两个分支的更改。这是最直观的方法,因为它保留了完整的历史记录,但可能会导致历史变得复杂。
执行以下命令来设置合并为默认的拉取策略:
git config pull.rebase false
- 变基(Rebase):这会将你的本地更改重新应用在远程分支的最新提交之上。这会创建一个更干净的项目历史,但它会改变已经存在的提交的历史。
执行以下命令来设置变基为默认的拉取策略:
git config pull.rebase true
- 快进(Fast-forward only):如果你的本地分支落后于远程分支,Git 只会更新你的本地分支以匹配远程分支。如果你的本地分支包含了远程没有的提交,Git 会拒绝操作。
执行以下命令来设置快进为默认的拉取策略:
git config pull.ff only
你可以选择一个适合你工作流程的策略,并使用上面的命令来配置它。如果你想为所有仓库设置默认策略,可以使用 --global
标志。例如,如果你想全局设置合并策略,可以使用:
git config --global pull.rebase false
如果你只想为当前操作解决这个问题,而不改变全局设置,你可以在执行 git pull
命令时添加相应的标志,例如:
- 对于合并:
git pull --no-rebase
- 对于变基:
git pull --rebase
- 对于快进:
git pull --ff-only
选择一个策略后,运行相应的命令,然后你应该能够成功地拉取和合并远程分支的更改。
git reset¶
git reset --hard efa965834671bd20a19c049b572b647fc07613c4
会回退到efa965834671bd20a19c049b572b647fc07613c4
这次提交,后面的提交在本地没有了,但是可以拉取。
iOS合并代码¶
只处理project.pbxproj。
pod的冲突会很多,不处理ProjectName/Pods/Pods.xcodeproj
,删除pod冲突的文件,重新pod解决。