# Git使用
# 0、初始化仓库
git init, 可以初始化本地仓库
本地仓库和远程库关联 git remote add origin git@github.com:XuedaoYuan/learngit.git
git clone <repository_url>
, 从远程克隆仓库到本地,分支是远程的默认分支。
如果想克隆指定分支,可以使用
git clone -b <branch_name> <repository_url>
工作区: 当前工作的文件夹 working directionary
暂存区: add之后添加到的地方
# 1、配置用户
# 配置全局用户
git config --global user.name "bryan sun"
git config --global user.email "hitsjt@gmail.com"
git config -l 查看配置项
如果不想配置全局用户,只想配置某一个repo下的。进到这个repo的目录下然后配置当前repo的用户
git config user.name "bryan sun"
git config user.email "hitsjt@gmail.com"
# 2、设定默认远程push分支
设定默认远程push分支
git branch --set-upstream-to=origin/dev
git branch -u origin/dev 和上面是一个意思
现在随便修改一下工程文件的内容,然后git commit ,git push,之后就可以直接提交到远程的dev分支中,而不会是master
git branch --unset-upstream master 撤销本地与远程分支的映射关系
git branch -m main
设定默认push分支
git push --set-upstream origin master
git push -u origin master 和上面的一样效果
# 3、git add 添加文件到git追踪系统
git add 添加新的文件到版本库
git add -u 仅监控已经被add的文件(即tracked file) 不会提交新文件
git status 查看版本库的状态
git diff 查看文件修改前后的区别
Reset 之后往往本地的版本会落后远端的版本, 这时候如果需要推送就得借助git push -f 也就是fast-forwards 强制合并
# 4、提交和回退
git commit -m "message". 提交修改
git reset --hard HEAD^ 回退到上一个版本 , HEAD^^表示前2个版本,前100个版本可以写成HEAD~100。这是强制回退,文件都会被修改
git reset --soft HEAD~1 回退到上一个版本,会删除commit记录, 相比hard不会重置文件内容,可以修改后再次提交
git reset --hard commit_id 可以回到对应提交id的版本
# 5、关于日志
git log --pretty=oneline 查看提交日志
git log --pretty=format:%s 查看格式化的commit日志
git log --graph --pretty=oneline --abbrev-commit 查看分支合并情况
git reflog 查看命令历史,
git commit --amend 编辑最近一次的提交日志
查看某个文件夹的提交历史 git log -- /folder
# 6、checkout
git checkout -- <file>
撤销修改, 回到上一次add或者commit时的状态。修改了文件但是还没有提交, 这时候不想要了,丢弃的话可以使用这个
git checkout -b dev origin/dev 基于远程dev分支创建本地dev分支
git reset HEAD <file>
撤销暂存区的修改, 回到add之前。文件内容不会发生变化
# 7、rm 删除 和 恢复
git rm test.txt 删除文件, 之后可以直接commit提交删除操作
恢复删除的文件 不小心从本地删除文件 git checkout -- file_name 可以重新恢复
# 8、推送远程仓库
git push -u origin master 推送本地仓库到远程库,
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
以后做了修改就可以 git push origin master 把本地master分支的最新修改推送到origin远程仓库
git remote remove origin 取消关联远程仓库
git remote -v 查看自己的权限
# 9、分支相关
git branch -a 查看所有分支
git branch dev 创建dev分支
git checkout dev 切换为dev分支
git branch 查看当前分支和其余分支
git branch -d dev 删除dev分支
git branch -a 查看所有分支
git branch -D feature-vulcan feature-vulcan分支如果还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。
# 10、Stash
git stash 存储工作现场, 等以后恢复现场后继续工作: 这个主要用于当有临时bug需要修复,但是当前工作未完成, 需要先修bug, 但是不提交
git stash list 存储列表
git stash pop 恢复工作现场
# 11、tag标签
git tag <tagname>
创建一个标签, 默认是当前最新的commit,一般
git tag <tagname> <commit-id>
也可以指定一个以前的commit 打tag
git tag -a <tagname> -m “desc”
可以给这个标签加说明文字
git tag 查看所有的标签
git show <tagname>
可以查看这个标签的详情
git tag -d <tagname>
删除标签
git push origin <tagname>
推送标签到远程
git push origin —tags 推送所有的标签到远程
refusing to merge unrelated histories
git pull origin master --allow-unrelated-histories
给分支添加备注
npm i -g git-br
git config branch.分支名称.description 杭州安全通开发分支
Git br 查看分支描述
# 12、关于合并
# 12.1 只合并文件的改动,不合并提交commit记录
注意下面只是简单的文件拷贝,不会合并
# 先切换到想要合并到的分支,可以用 git checkout target-branch
git checkout source-branch -- .
这将会把source-branch
分支上的所有变更(但不包括commit)应用到当前的target-branch
分支上,需要创建一个新的commit来记录这次变更。
如果只想把某个文件拷贝过来。
git checkout dev4 src/1.js
如果想把某个文件下的文件变动拷贝过来
git checkout dev4 src/*
# 12.2 git merge fast-forward 快进合并
git merge dev
合并指定分支(dev) 到当前分支, 使用fast forward模式, 也叫做快进合并
'快进合并是指在合并操作中,如果当前分支的历史完全包含在目标分支的历史中,Git 可以直接将当前分支指向目标分支的最新提交,而无需生成额外的合并提交。换句话说,Git 在这种情况下无需创建新提交来表示“合并”操作。'
简单来说,快进合并意味着目标分支已经是当前分支的“延续”。
示例场景
假如我们有一个repo的main分支,最初历史如下
A -- B -- C(main)
然后我们新建一个名为feature的分支,并在这个分支上进行了两次提交
A -- B -- C(main)
\
D -- E (feature)
如果在main分支没有额外的提交,现在你想要将feature分支合并回main分支,在这种情况下,main分支的提交历史完全是feature分支提交历史的子集。因此我们可以使用快进合并,只需要将main分支的指针指向feature
A -- B -- C -- D -- E (mian, feature)
使用如下的命令
git checkout main
git merge feature
这种情况不会产生额外的合并提交,只移动main分支的指针到feature最新提交E。合并后的历史是线性的,简化了项目的历史记录。
如果不想快进合并,仍然想保留分支历史, 可以使用 --no-ff 。
# 12.3 非快进合并
git merge --no-ff -m "merge with no-ff" dev 不适用fast forward模式合并分支, 此种方法会保留分支记录
非快进合并示例
假如我们有一个repo的main分支,最初历史如下
# main
A -- B -- C(main)
#feature
A -- B -- C(main)
\
D -- E (feature)
如果main分支也进行了新的提交F
A -- B -- C -- F(main)
\
D -- E (feature)
在这种情况下,git无法进行快进合并,会创建一个新的合并提交记录
A -- B -- C -- F -- M (main)
\ /
D -- E (feature)
# 12.4 cherry-pick 只合并某一个分支的某一次commit到当前分支
1、使用git cherry-pick
命令来选择并应用该commit:
一旦你有了commit的哈希值,就可以使用git cherry-pick
命令来应用它。例如,如果你的commit哈希值是abc1234
,你可以运行:
git cherry-pick abc1234
这条命令会将指定的commit应用到当前分支上。
2、**解决冲突(如果有的话)**: 如果合并过程中出现了冲突,Git会暂停cherry-pick操作,并让你解决冲突。你需要手动编辑冲突的文件,解决冲突后,使用以下命令继续cherry-pick操作:
git add <resolved-file>
git cherry-pick --continue
如果你决定放弃这次cherry-pick操作,可以使用:
cherry-pick --abort
# 13、抓取和拉取
**git抓取(fetch)和git拉取(pull)的主要区别在于它们对远程仓库数据的处理方式和适用场景不同。**
# 行为差异
- git fetch:从远程仓库获取最新的提交和分支信息,但不会自动将这些更改合并到当前分支。远程分支(如origin/main)会更新,但本地分支(如main)保持不变。
- git pull:相当于git fetch和git merge的组合,从远程仓库获取最新的提交和分支信息,并立即将这些更改合并到当前分支。这意味着本地分支会自动更新为与远程分支同步的状态。
# 适用场景
- git fetch:适用于想要先了解远程仓库的最新状态,再决定如何处理更新的情况。对更改合并有更精确的控制,适合在多人协作项目中使用。
- git pull:适用于确定需要立即将远程更改同步到本地分支的情况。对合并行为无需过多控制,适合在单人项目中使用更为方便。
# 具体操作示例
- git fetch:例如,
git fetch origin main
会从远程仓库获取最新的提交和分支信息,但不会自动合并到当前分支。 - git pull:例如,
git pull origin main
会从远程仓库获取最新的提交和分支信息,并立即将这些更改合并到当前分支。
# git revert
git revert 用于反做某一个版本, 比如commit 了 三次, 但是第二次不想要了, 但是保留第三次的提交。 就需要用到revert
git revert -n commit_id 反做这个id的commit。可能会出现冲突 需要手动解决,然后重新commit 一次即可。 注意此时的commit message 最好写成如下格式
Revert "feat(txt): add txt"
This reverts commit 6788a3c72b6bae5a9780503ea69681da18f44c3e.
# git rebase
Rebase 可以对某一段线性提交历史进行编辑、删除、复制、粘贴, 合理使用rebase可以使得我们的提交历史干净简洁
1、合并多个commit为一个完整的commit
git rebase -i ( startpoint endpoint ] 前开后闭
git rebase -i HEAD~2 2表示要合并的数量
弹出之后的
2、将某一段commit粘贴到另一个分支上
git rebase -i ( startpoint endpoint ] —onto [branchName]
--onto的意思是要将该指定的提交复制到哪个分支上, 此时的HEAD 是有问题的, 一般需要
git checkout branchName
git reset --hard last_commit
# Fork之后如何拉取代码提交PR
此种情况适用于本地clone的是fork后的仓库,然后需要拉取原仓库,同时提交自己的代码到原仓库,可以提交PR,PR可以邀请人来审核之后merge
本地添加原仓库的地址
git remote add upstream <原仓库git地址>
获取原仓库指定分支的更新
git fetch upstream main
合并原仓库的指定分支代码到本地的分支
git merge upstream/main git merge upstream/main origin/dev
有冲突的话需要合并
修改代码合并之后提交到本地仓库
git add . git commit -m "some change"
推送提交到自己fork的仓库
git push orimain dev
这时候可以到gitlab或者github提交PR。等待审核人合并PR即可