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以外的所有文件都写出来!