Featured image of post git 入门使用

git 入门使用

概念

所有的版本控制系统,其实只能跟踪文本文件的改动,比如 TXT 文件、网页、所有的程序代码等等。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从 100KB 改成了 120KB。Microsoft 的 Word 格式是二进制格式,因此,版本控制系统是没法跟踪 Word 文件的改动的。

工作区:就是你在电脑里能看到的目录。

版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。版本库里存了很多东西,其中最重要的就是称为 stage(或者叫 index)的暂存区。

还有 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD。

配置姓名和邮箱

1
2
git config --global user.name "Your Name"
git config --global user.email "email@example.com"

--global 参数表示这台机器上所有的 Git 仓库都会使用这个配置。当然也可以对某个仓库指定不同的用户名和 Email 地址。

本地仓库

命令说明
git init在当前目录下会自动生成 .git 隐藏文件夹,该隐藏文件夹就是 git 版本库。
git add <file>将文件添加到暂存区(将目标文件加入跟踪列表)。
git add -A将所有文件添加到存储区。
git add -f App.class强制添加。被 git 忽略的文件也可以强制添加。
git commit –m "message"将暂存区文件提交到版本库。-m 参数为提交说明。
git status显示工作目录和暂存区的状态。
git log --pretty=oneline显示提交日志。--pretty=oneline 只显示 commit id 和描述。
git reflog查看命令历史。
git diff <file>比较当前文件和暂存区文件差异。
git diff HEAD [<path>...]比较工作区与最新本地版本库。
git reset --hard HEAD^将当前 HEAD 复位到指定状态。HEAD 表示当前版本,HEAD^ 表示上一个版本,HEAD^^ 表示上上一个版本,HEAD~100 表示前 100 个版本。
Git 的版本回退速度非常快,因为 Git 在内部有个指向当前版本的 HEAD 指针。当你回退版本的时候,Git 仅仅是改变 HEAD 指向。
git reset HEAD <file>把暂存区的修改撤销掉,重新放回工作区。
git checkout --file文件在工作区的修改全部撤销。文件没有被放到暂存区,撤销修改就回到和版本库一模一样的状态;文件已经添加到暂存区后,撤销修改就回到添加到暂存区后的状态。
git rm file删除文件,同时还会将这个删除操作记录放到缓存区。

分支管理

命令说明
git checkout master切换分支。
git branch查看当前有哪些分支。当前分支前面有个星号。
git branch dev创建分支 dev。
git branch -d dev删除 dev 分支。
git branch -D dev强制删除 dev 分支。
git branch dev origin/dev创建远程 origin 的 dev 分支到本地。默认克隆只有master分支。
git checkout -b dev创建并切换到 dev 分支。
git merge dev将当前分支合并到 dev 分支。
git merge --no-ff -m "merge with no-ff" dev将当前分支合并到 dev 分支。--no-ff 参数,表示禁用快速模式。
普通模式:当前分支合并时会提交到版本库,不是简单的变更指针指向。
快速模式:把当前分支指向指定分支。
git log –graph查看分支合并图。

分支策略

master 分支称为主分支,HEAD 表示指向当前分支。

master 分支应该是非常稳定的,dev 分支是不稳定的。1.0 版本发布时,再把 dev 分支合并到 master 上,在 master 分支发布 1.0 版本。每个人都在 dev 分支上干活,每个人都有自己的分支,时不时地往 dev 分支上合并。

在 master 分支修复 bug,必须新建 bug 分支,修复完切换到 master 分支合并 bug 分支。

在 dev 分支上开发新功能,新建 Feature 分支,新功能开发完毕切换到 dev 分支合并,如果不想合并必须强制删除。

总结:

  • master 分支是主分支,因此要时刻与远程同步。
  • dev 分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步。
  • bug 分支只用于在本地修复 bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个 bug。
  • feature 分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

status

命令说明
git stash会把所有未提交的修改(包括暂存的和非暂存的)都保存起来。便于切换其他分支,修改其它分支的代码。
git stash list列出通过 stash 储藏的修改。
git stash apply stash@{0}恢复 stash@{0}。
git stash drop stash@{0}删除 stash@{0}。
git stash pop恢复的同时把stash内容删除。

标签管理

命令说明
git tag <name>给最近的 commit 打上标签。tag 就是一个让人容易记住的有意义的名字,它跟某个 commit 绑在一起。
git tag v0.9 f52c633给指定 commit id 打上标签。
git tag显示所有标签。

远程仓库

命令说明
git remote add [shortname] [url]添加远程仓库关联。shortname 只能对应一个 url。
注意:推送代码前必须先关联远程仓库。
git remote不带参数,列出已经存在的远程连接。
git remote –v列出远程连接,并显示对应 url。
git remote remove <name>删除远程仓库。
git push <远程主机名> <本地分支名>:<远程分支名>将本地分支的更新,推送到远程主机。
git push origin master将本地的 master 分支推送到 origin 主机的 master 分支。如果 master 不存在,则会被新建。
git push -u origin master-u 选项指定一个默认主机,这样后面就可以不加任何参数使用 git push。
git push origin :master删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
git push –all origin推送所有分支。
git push -f origin dev:master强制推送。
git clone <版本库的网址>本地主机生成一个目录,与远程主机的版本库同名。
git clone <版本库的网址> <本地目录名>如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数。
git pull <远程主机名> <远程分支名>:<本地分支名>拉取远程主机某个分支的更新,再与本地的指定分支合并。
git fetch <远程主机名> <远程分支名>:<本地分支名>git fetchgit pull 类似,但不会自动合并当前分支。
git branch --set-upstream debug origin/debug将本地 bug 分支与远程的 bug 分支关联。解决拉取时 git 提示 no tracking information 的问题。

克隆和拉取

clone 是本地没有 repository 时,将远程 repository 整个下载过来

pull 是本地有 repository 时,将远程 repository 里新的 commit 数据(如有的话)下载过来,并且与本地代码 merge。

Licensed under CC BY-NC-SA 4.0
最后更新于 2025-03-30 16:10 UTC