Repository
我们先来认识一下版本库——Repository
,接下来我们所有提到的 Git
基础命令,都是基于版本库的。
那么什么是版本库呢?版本库又名仓库,英文名 repository
,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git
管理起来,每个文件的修改、删除,Git
都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
仓库又分为本地仓库和远程仓库:
- 本地仓库:项目在你本地开发机(电脑)存放的历史记录
- 远程仓库:项目在服务器上(如GitHub、GitLab)的历史记录
接下来,我们首先看看 Git
版本库创建的相关命令。
初始化本地仓库 —— git init
-
创建一个空目录,作为项目文件夹
//创建一个空目录 mkdir ios-git cd ios-git pwd <!-- /Users/xxx/ios-git -->
-
初始化仓库
git init
瞬间
Git
就把本地仓库建好了,而且告诉你是一个空的仓库(empty Git repository
),同时在当前目录下多了一个.git
的目录,这个目录是Git
来跟踪管理版本库的,如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看到了。 -
连接远程仓库
以只是在本地创建了仓库,团队协作中为了让大家都可以访问,需要把代码放在远程仓库(你可以在GitHub、Gitee或GitLab上创建远程仓库):
git remote add origin ssh://git@git.xxx.com:2289/ios/docs.git
git add .
git commit -m "Initial commit"
git push -u origin main
这样才是一个完整的仓库创建。
克隆现有的仓库 —— git clone
如果远程仓库已经存在项目,你想把项目拉取下来,那就简单了。这时就要用到 git clone
命令,Git
克隆的是该 Git
仓库服务器上的几乎所有数据,每一个文件的每一个版本都将被拉取下来
git clone https://gitcode.net/codechina/help-docs
这会在当前目录下创建一个名为 help-docs
的目录,并在这个目录下初始化一个 .git
文件夹,如果你进入到这个新建的 help-docs
文件夹,你会发现所有的项目文件已经在里面了,准备就绪等待后续的开发和使用。
自定义本地仓库名称
你想在克隆远程仓库的时候,自定义本地仓库的名字:
git clone https://gitcode.net/codechina/help-docs mydocs
以上就是开发的准备工作,初始化Git后,就是在工作中的使用了,下面列举一些常用的Git方法:
Git 常用方法
作用 | 方法 | 备注描述 |
---|---|---|
查看仓库当前状态变化 | git status git status -s 简短输出 | 查看工作区和暂存区有没有未提交的文件 |
比较变动 | git diff readme.txt | 查看readme.txt具体修改的内容是什么 |
添加 | git add readme.txt git add . | 把文件从工作区添加到暂存区git add . 是添加所有修改的文件 |
提交 | git commit -m "提交备注" git commit -a git commit -am "提交备注" | 把暂存区的所有内容提交到当前分支,你可以在 “” 里面备注自己提交的什么 -a 是代表add ,也就是不用单独再使用add 命令了, |
拉取 | git pull git pull origin git pull origin master:dev | git pull origin master:dev 拉取master 分支合并到dev 分支 |
推送 | git push git push origin master git push --force origin master 强制推送 | 如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数 |
查看日志 | git log git log --oneline git log --reverse --oneline | 查看当前HEAD 及之前提交的历史记录--oneline 简洁输出--reverse 正序输出,默认时间倒序输出最近时间的 |
查看修改记录 | git blame readme.txt | 查看readme.txt文件的修改记录 |
重置/回退 | git reset --hard HEAD^ git reset --hard commit_id | 在 Git 中,用HEAD 表示当前版本,也就是最新的提交e55063a ,上一个版本就是HEAD^ ,上上一个版本就是HEAD^^ ,100个^ 写成HEAD~100 ,也可重置到指定的commit_id reset 将 HEAD 指向自己重置的提交记录commit_id ,commit_id 之后的提交记录都不复存在 |
还原/回滚 | git revert --hard HEAD^ git revert --hard commit_id | git revert 是用来重做某一个 commit 提交的内容,在分支上面会创建了一个新的 commit 提交,我们还原commit_id 这条记录时,这条记录提交的代码会被清掉,这条记录之前和之后的代码还在 |
查看本地日志 | git reflog | 查看当前HEAD 之前和之后(也就是整个分支)提交的历史记录如果你reset 后,第二天后悔了,git log 是查不到你昨天的提交记录的,git reflog 就可以,然后再用git reset --hard commit_id 回到最初的代码reflog 并不是Git 仓库的一部分,它是本地.git/logs/HEAD 或者是.git/logs/refs 目录中的文件,只能看到你在本地操作的提交记录。 |
补提交 | git commit --amend git commit --amend -m "提交描述" | 当你git commit 未git push 时,发现还有修改需要提交,但是不想再增加commit 记录git commit --amend 会创建一个新的commit_id 覆盖之前的commit_old 记录,git log 查看记录会看到新的commit_id 记录,之前的commit_old 记录就没了。 |
取消暂存 | git reset HEAD git reset HEAD readme.txt | 把文件从暂存区恢复到工作区,上面讲到的重置命令是加了--hard ,意思是将工作区和暂存区都恢复到最初 |
撤消修改 | git checkout . git checkout -- readme.txt | 文件在工作区没有放到暂存区时(未add),想放弃对文件的修改 git checkout . 放弃所有 |
查看分支 | git branch 查看本地分支 git branch -a 查看远程分支 | |
创建分支 | git checkout -b dev git branch dev | 创建 dev 分支 |
切换分支 | git checkout dev git switch dev | 切到 dev 分支上 |
合并指定分支到当前分支 | git merge dev | 把dev分支合并到当前分支 |
删除分支 | git branch -d dev | |
创建标签 | git tag v1.0 git tag -a v1.0 -m "发布1.0版本" | |
查看所有标签 | git tag 查看本地标签git ls-remote --tags origin 查看远程标签 | |
删除标签 | git tag -d v0.1 删除本地标签 git push origin :refs/tags/v0.1 删除远程标签 | 如果你已经推送到远程了,那这两个命令都要用 |
推送tag标签 | git push origin v0.1 推送单个taggit push --tags git push origin --tags | 开发中直接使用git push --tags 就足够了 |
查看缓存列表 | git stash list | |
缓存 | git stash git stash save git stash save "xxx" | 将文件从工作区移除然后放在缓存里,stash 只会操作被git 追踪的文件,新增的文件并不会进入缓存,因为git 还没有追踪这个新增的文件。 |
取出缓存 | git stash pop git stash pop stash@{$num} | 取出缓存到工作区并从堆栈中移除stash 默认恢复git 栈中最新的一个stash@{num},建议在git 栈中只有一条的时候使用,以免混乱 也可以指定stash@{$num} |
恢复缓存 | git stash apply git stash apply stash@{$num} | 将堆栈中的内容恢复到当前分支下,该命令不会将内容从堆栈中删除缓存 |
移除缓存 | git stash drop git stash drop stash@{$num} | 从堆栈中移除stash 、移除指定的stash@{$num} |
清空缓存 | git stash clear | 移除全部的stash |