常用的git指令以及操作

196 阅读8分钟

1.常用的git应用

sourcetree、Fork、终端

2.常用的git指令

首先进入到目录下,然后使用下面命令初始化git

git init

git add 文件名 //添加某个文件

git add . //添加所有更改

git commit -m "本次提交备注" //提交到本地仓库 git status查看当前提交的信息状态

git branch 查看当前git分支列表,也能看到当前的分支

git branch -M master 将当前分支重命名 master

git checkout -b dev 创建一个新的分支,名称为dev,并切换到该分支

git checkout master 切换到master分支,只能切换到已经存在的分支

git checkout dev 切换到dev分支

git checkout [filename] //切换某文件,也就是忽略该文件改动

git pull origin master [示例1:拉取远端origin/master分支并合并到当前分支]

git pull origin dev [示例2:拉取远端origin/dev分支并合并到当前分支]

git log 查看最近提交记录信息

全局设置

很多人可能会忽略全局设置,一般没事,在一些公司如果你的全局名字跟ssh对应的账号邮箱不一样是上传不上去的,这个也是需要注意的

git config --global user.name "你的名字" git config --global user.email "你的邮箱"

全局忽略文件

~/.gitignore_global

以mac为例,忽略文件就在这里,如果有些项目文件该上传的没上传,应该就是设置这里了,可以尝试取消忽略 vim

合并分支(不能在当前分支合并当前分支)

git merge dev //讲dev分支合并到当前分支,注意如果要合并到一个分支到另一个分支,请先切换分支到另一个分支例如:开发新功能分支dev, 原始分支master,要发布一个版本,合并版本,先切换到master分支,在合并dev分支:1 git checkout master 2 git merge dev

遴选功能

即:将其他分支某次的提交更改内容,遴选应用到当前分支

git cherry-pick [某次提交commit-id]

删除分支(不能删除当前分支)

git branch -d dev //删除dev的分支,这种只能删除没有提交的git分支

git branch -D dev //强制删除dev分支,已经提交的Git分支也能删除

回退操作,假如合并代码冲突了,可以用这个

git revert 是撤销某次操作,此次操作之前的commit都会被保留

git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区

查看某次commit的改动

git show 356f6def9d3fb7f3b9032ff5aa4b9110d4cca87e

即可显示具体的某次commit的改动~

git show c5e69804bbd9725b5dece57f8cbece4a96b9f80b filename

只看某次提交中的某个文件变化,可以直接加上fileName

连接到远端

注意后面是Git仓库名称,可以是https的,也可以是ssh的

Git 使用命令推送到远程仓库

git remote add origin git@github.com:Marshal-S/LSWebView.git

git push -u origin master //将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了

git push origin master //默认推送到远程仓库的方式,不做任何设置

如何把现有的仓库内容推送到另外一个仓库

首先更改url

git remote set-url --add origin git@github.com:Marshal-S/LSWebView.git

然后推送

git push origin master

//查询当前远程的版本

$ git remote -v

//直接拉取并合并最新代码

$ git pull origin master [示例1:拉取远端origin/master分支并合并到当前分支]

$ git pull origin dev [示例2:拉取远端origin/dev分支并合并到当前分支]

从本地提交代码到服务器

$ git push origin dev [示例2:将当前分支提交到远端origin/dev分支]

git从仓库中导出某一个版本

git archive -o ../../publish/a2.zip(目标路径以及文件包名) 31d0104(当前版本)

git变基 rebase

变基(既Rebase,后续统一使用变基指代)相似的概念就是Merge,也可以说变基是从Merge演化而来。

变基的结果一般和Merge一样,但是变基实现方式并不是合并,而是重放,就是将分支A的提交在分支B上所有提交重新提交一遍( 一般在单独的新分支使用,如果是版本分支,不建议rebase),rebase 不会额外创建新的合并记录

变基的一般命令为:

git rebase baseBranch [rebaseBranch]  //将所选分支变基到当前分支

交互式变更合并提交记录(还没提交到远端就可以)

git rebase -i HEAD~4 //最后一个是从最新往前一共几条历史记录

然后出现一个编辑页面(pick 表示选择,默认那几条都是pick)

  • pick 是原封不动使用这个 commit
  • reword 是使用这个 commit,但是修改 commit message
  • edit 是使用这个 commit,但是修改这个 commit 的内容,然后重新 amend。
  • squash(s) 是合并这个 commit 到之前的 commit

reword 1223123123 合并了

s 223423

直接wq保存,如果冲突后,会出现另外一个编辑页面,处理完毕后,直接保存历史也行

撤销变基

git rebase --abort

暂存取出

git stash 暂存更改到栈顶

git stash pop 取出栈顶的暂存更改

git stash list 查看暂存的内容列表

git stash apply stash@{1} 应用特定的暂存记录,可以通过list看到的结果应用

git stash drop stash@{1} 删除特定的暂存记录

git stash clear 清除所有暂存记录

git stash show stash@{1} 查看特定的暂存记录

撤销还原

git reset 用于撤销更改和移动分支指针

git reset [<模式>] [<提交>]

1. 软重置 (--soft)

  • 移动 HEAD 到指定提交
  • 保留更改在暂存区
  • 保留工作目录的修改
git reset --soft HEAD~1    # 撤销最后一次提交,更改保持暂存状态

2. 混合重置 (--mixed,默认模式)

  • 移动 HEAD 到指定提交
  • 取消暂存更改,但保留在工作目录
  • 这是默认模式
git reset HEAD~1           # 等同于 --mixed
git reset --mixed HEAD~1   # 撤销最后一次提交,取消暂存但保留更改

3. 硬重置 (--hard)

  • 移动 HEAD 到指定提交
  • 丢弃暂存区和工作目录的所有更改
  • 谨慎使用 - 可能导致数据丢失
git reset --hard HEAD~1    # 完全删除最后一次提交和所有更改

常见使用场景

### 撤销最后一次提交(保留更改)
git reset --soft HEAD~1    # 更改保持暂存状态
git reset --mixed HEAD~1   # 更改取消暂存但保留在工作区

### 取消文件暂存
git reset HEAD <文件>      # 取消特定文件的暂存
git reset                 # 取消所有文件的暂存

### 丢弃本地修改
git reset --hard HEAD      # 丢弃所有未提交的更改
git reset --hard origin/main # 重置到与远程仓库一致

### 重置到特定提交
git reset --hard abc123    # 重置到指定提交

## 重要注意事项
-   **谨慎使用 `--hard`** - 会永久丢弃更改
-   **恢复方法**:最近重置的提交可以通过 `git reflog` 找回
-   **远程仓库**:重置后推送到远程仓库需要使用 `git push --force`(慎用)

## 更安全的选择

-   `git revert` - 创建新的提交来撤销更改(对共享历史更安全)
-   `git checkout` / `git restore` - 恢复文件而不修改历史

设置忽略文件gitignore

在仓库目录下新建一个名为.gitignore的文件

以'#'开始的行,被视为注释.

忽略掉所有文件名是 project.txt的文件.

project.txt

忽略所有生成的 html文件,

*.html

project.html是手工维护的,所以例外.

!project.html

忽略所有.o和 .a文件.

*.[oa]

配置语法:

以斜杠“/”开头表示目录;

以星号“*”通配多个字符;

以问号“?”通配单个字符

以方括号“[]”包含单个字符的匹配列表;

以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;

常用的规则:

/mtk/ 过滤整个文件夹

*.zip 过滤所有.zip文件

/mtk/do.c 过滤某个具体文件

被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。

需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中:

!*.zip

!/mtk/one.txt

唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。

为什么要有两种规则呢?想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么我们就需要使用:

/mtk/

!/mtk/one.txt

假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!