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 loggit 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 --amendgit commit --amend -m "提交描述" | 当你git commit未git push时,发现还有修改需要提交,但是不想再增加commit记录git commit --amend会创建一个新的commit_id覆盖之前的commit_old记录,git log查看记录会看到新的commit_id记录,之前的commit_old记录就没了。 |
| 取消暂存 | git reset HEADgit 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.0git 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 --tagsgit 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 |


















