Git基础
文章目录
一、安装配置:
1、安装:
以macOS
用Homebrew
安装为例:
1、安装Homebrew
:
官网有安装命令:https://brew.sh/
将Install Homebrew
下面那行命令复制粘贴到Terminal
中,回车就好了
2、运用Homebrew
安装git:
Terminal
中运行:brew install git
(还有其他方法,and其他系统的安装方法,Git官网中都可以找得到)
2、配置
Git 提供了一个叫做git config
的工具,专门用来配置或读取相应的工作环境变量。
这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
1、~/etc/gitconfig
文件:系统中对所有用户都普遍适用的配置,用git config —system
读写(操作系统可以设置多个用户)
2、~/.gitconfig
文件:用户目录下的配置文件,只适用于该用户,用git config —global
读写
3、xxx/.git/config
文件:当前项目Git目录的配置文件,只适用于当前项目
(这三个文件中的配置,下面的会覆盖上面的)(即:优先级从低到高)
3、配置用户信息
设置怎样显示自己的提交。例如:
git config --global user.name xxx # 设置用户名
git config --global user.email xxx.com # 设置邮箱
git config --global —unset user.name # 删除用户名设置
git config --global —unset user.email # 删除邮箱设置
4、忽略文件:.gitignore
有些文件是不需要同步的,如:三方库
以Apple
开发举例:Pods
文件夹下的所有三方库,可以根据Podfile
用cocopods
下载就行
需要忽略的文件可以用.gitignore
设置,github
上有个库保存了各个语言适用的gitignore
文件,需要的可以自取:https://github.com/github/gitignore
二、基本概念:
图片来自:菜鸟教程
1、工作区workspace
:就是我们敲代码编辑文件的地方
2、暂存区staging area
:修改过的文件需要暂存后才能commit
3、本地版本库local repository
:将暂存区的代码commit
后,就会存在本地仓库。(本地可以保存多个commit
,后一起提交)
4、远程版本库remote repository
:commit
后的代码push
后,就会提交到远程仓库了。(就可以在云端上保存你的代码了)
三、基本操作:
按正常工作流程的顺序介绍,接下来的命令说明中:
<>:表示应该根据情况填写不同的值
[]:表示可选参数
1、Init、Clone
git init # 初始化项目,生成.git文件夹,开始记录代码修改提交
git remote add origin https://gitee.com/momo/demo.git # origin代替远程仓库地址
就可以在项目文件中看到.git
文件夹(默认隐藏),所有此项目相关的快照数据都会存放在这里
git clone https://github.com/XXX.git # 拷贝一份远程仓库,即下载一个项目
2、Status 状态
git status # 查看上次提交后文件的修改情况)
git status -s # 简洁显示
3、Add 添加
add命令可以将文件添加到暂存区:
git add . # 添加所有文件
git add hello.txt readme.md … # 添加指定文件
git add dir # 添加指定文件夹
4、RM 删除
git rm hello.txt # 将文件从工作区中删除
git rm -f hello.txt # 已经放到暂存区的文件,需要使用强制删除指令-f
git rm —cached hello.txt # 将文件从暂存区中移除,但保留在工作区
git rm -r * # 递归删除当前目录下的所有文件和子文件
5、MV 重命名/移动
git mv readme readme.md # 重命名文件
git mv readme dir # 移动文件
6、Stash 存储
git stash # 将当前修改存储起来
git stash list # 查看存储列表
git stash clear # 清除所有存储
git stash pop # 应用最后一次存储,并删除
git stash apply # 恢复最近一次存储
git stash apply stash@{2} # 恢复某一次存储
git stash drop stash@{2} # 删除某一次存储
7、Pull 拉取
git pull
其实就是 git fetch
和 git merge FETCH_HEAD
的简写。格式如下:
git pull <远程主机名> <远程分支名>:<本地分支名>`
# 从远程获取代码,并合并本地的版本
git pull # 拉取更新)
git pull -r # rebase:没有 merge 那个提交
git pull origin # 更新
git pull origin dev # 拉取dev分支
如:
# 将远程主机`origin`的`master`分支拉取过来,与本地的`dev分支合并
git pull origin master:dev
# 如果需要合并的是当前分支,则冒号后面的分支名可以省略
git pull origin master
8、Diff 比较文件差异
git diff [file] # 工作区-暂存区,可以指定文件
git diff --stat # 简洁显示
git diff —staged [commitID] [file] # 暂存区和上一次`commit`的差异:(可以指定`commitID`和文件
git diff —cached [commitID] [file] # 同上
git diff [commitID1] [commitID2] # 两次提交差异
9、Commit 提交
提交暂存区到本地仓库
git commit -m [message] # `message`:提交日志
git commit [file1] [file2] ... -m [message] # 提交指定文件
# 如果需要提交的文件,不想一个一个的`add`到暂存区,可以使用`-a`参数:
git commit -a -m [message] # `-a`会提交`Untracked`状态的内容(`Untracked`:未暂存)
10、Reset 撤销修改
git reset # 将暂存区文件重置到跟上一次`commit`保持一致,工作区文件保持不变
git reset HEAD^ # 回退所有内容到上一个提交
git reset HEAD^^ # 回到上上个提交
git reset HEAD~1 # 回到上一个版本 可以写:1~100)
git reset HEAD^ hello.txt # 回退hello文件)
git reset <commitID> # 回滚提交记录,但本地代码不回滚)
git reset --hard HEAD # 撤销工作区和暂存区的所有内容,慎用!
git reset --hard <commintID> # 回滚提交记录和本地代码)
# reset`会清掉指定`commitID`后的所有提交,已提交远端的记录回滚,慎用!!!
git reset --soft HEAD^ # 软撤销)
11、Revert 还原提交
git revert <commitID>
还原指定提交(会直接生成新的commit,等待push)
Tips:如果需要还原多次commit
,应该按commit
的逆序revert
,才不会冲突。
12、Push 上传
将本地的分支提交上传到远程分支并合并,命令格式如下:
git push <远程主机名> <本地分支名>:<远程分支名>
git push <远程主机名> <本地分支名> # 如果本地分支和远程分支同名,可以省略冒号后的远程分支名
git push <远程分支名>
# 例:
git push origin master:master # 将本地的 `master`分支推送到 `origin` 主机的 `master` 分支
git push origin master # 同上)
git push origin HEAD:refs/for/master
git push origin HEAD:refs/for/podplus
git push origin --delete master # 删除 `origin` 主机的 `master` 分支,慎用!
13、Log 查看日志
git log # 查看历史提交记录
git log —oneline # 简洁输出
git log —graph —oneline # 显示修改详情
git blame <file> # 以列表形式查看指定文件的历史修改记录
git log [-p] master..dev # dev分支相比master分支有哪些不同的提交(仅包含分支的提交)
git log [-p] master…dev # dev分支和master分支有哪些不同的提交(包含拉出分支后master的所有提交
14、Branch 分支
git branch # 列出本地分支
git branch dev # 创建`dev`分支
git branch -d <分支名> # 删除已经合并过的分支
git branch -D <分支名> # 强制删除未合并的分支
git checkout dev # 切换到`dev`分支
git merge dev # 将`dev`分支合并到当前分支[如:`master`分支]上
-
如果有冲突,需要处理:
分隔符上部分:当前分支内容
分隔符下部分:远程分支内容 -
处理非文本文件冲突:
git checkout —theirs lib/base.all # 采用远程分支
git checkout —ours lib/base.all # 采用本地分支
# 如果冲突暂时解决不了,就可以撤销合并
git merge —abort # 撤销合并
15、Cherry-pick 引入更改
git cherry-pick <commitID> # 引入某个提交的修改
git cherry-pick --edit <commitID> # 引入某个提交的修改,并编辑其commit msg
git cherry-pick --e <commitID> # 引入某个提交的修改,并编辑其commit msg
git cherry-pick <commitID1> <commitID1>… # 引入多个提交
git cherry-pick <commitID1>…<commitIDn> # 引入从`commitID1`到`commitID1n`的所有提交
git cherry-pick <commitID1>^…<commitIDn> # 包含`commitID1`
git cherry-pick <branchID> # 引入某个分支上的最后一个的提交的修改
16、Tag标签
如果项目达到一个重要的阶段,并希望永远记住那个特别的提交,可以使用git tag
给它打上标签
git tag [-a] v1.0 # 不用`-a`,不会记录打标签的时间、用户,不能添加注解
git tag -a v0.9 <commitID> # 给已经提交的commit追加标签
四、补充
1、merge和rebase的区别
将dev分支合并到当前分支:
git merge dev
git rebase dev
-
Merge
:形成一个新的节点处理冲突更直接
适用于:公共分支的代码同步和合并
-
Rebase
:把分支的commit
”剪”下来,然后追加到主干 (commitID
会跟原dev
分支上的不同)如果此时
dev
还需要同步master
的代码,dev
分支就会有两份不同commitID
的相同提交,中间还会插一个新的commintID
能够保证清晰的
commit
记录适用于:个人未提交远端的
commint
记录的优化
举例:用rebase的方式反向合入master分支的代码:
git rebase master
git merge --continue
2、合并Commit
git rebase -i [合并后需要接的上一个提交commitID]
// 按 I开始编辑
// pick
的意思是要会执行这个 commit
// squash
的意思是这个 commit
会被合并到前一个commit
将需要合并的pick
改成squash
ESC
,输入 wq
(保存退出)
此时本地的多个commit
就合成了一个了,再push
。。。
3、修改commit message
3.1、修改最后一条commit message
git commit --amend
3.2、修改任意一条commit message
git rebase -i HEAD~2 # 倒数第几条,从1开始
# 按`I`,进入编辑,将需要修改的`commit`前面的`pick`修改为`edit`;
# 编辑方式:按`Esc`,按`:`,输入`:wq`,回车
git commit --amend # 修改2.2指定的commit message(编辑方式如上)
git commit --continue # 完成 rebase)
4、命令行记不住怎么办?
git help xxx
(可以查询相应命令的参数格式)
如:
git help config
git help commit
# 可能会用到的一些系统命令:
touch readme.md # 新建一个文件
vim readme.md # 打开一个文件编辑
参考:
Git官网:https://git-scm.com/