# 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

  1. 本地添加原仓库的地址

    git remote add upstream <原仓库git地址>
    
  2. 获取原仓库指定分支的更新

    git fetch upstream main
    
  3. 合并原仓库的指定分支代码到本地的分支

    git merge upstream/main  
    git merge upstream/main  origin/dev
    
  4. 有冲突的话需要合并

  5. 修改代码合并之后提交到本地仓库

    git add .
    git commit -m "some change"
    
  6. 推送提交到自己fork的仓库

    git push orimain dev
    
  7. 这时候可以到gitlab或者github提交PR。等待审核人合并PR即可

上次更新: 1/22/2025, 9:39:13 AM