写在最前:
Git❓一小时学会 Git
一、基本命令
1、git status #查看修改状态
# 查看指定文件状态 # 查看所有文件状态 |
2、git pull origin master #拉取远程仓库 master 分支合并到本地,master 根据场景换成其它分支名
3、git add file #添加文件到暂存区,可用 * or . 添加所有
# 添加指定文件到暂存区 # 添加指定目录到暂存区,包括子目录 # 添加当前目录的所有文件到暂存区 |
4、git commit -m "commit message" #提交暂存区到仓库区(提交到本地版本库,并添加注释,注释表明此次修改内容,要清晰准确)
# 提交暂存区到仓库区 # 提交暂存区的指定文件到仓库区 # 提交工作区自上次commit之后的变化,直接到仓库区,跳过了add,对新文件无效 # 提交时显示所有diff信息 # 使用一次新的commit,替代上一次提交 # 重做上一次commit,并包括指定文件的新变化 |
5、git push origin master #将本地版本提交到远程仓库 master 分支,master 根据场景换成其它分支名(将本地的 master
分支推送到 origin
主机的 master
分支,如果后者不存在,则会被新建)
对大部分日常工作来说, 上面几个命令基本就够用了。
二、新建项目
1、设置用户名与邮箱(用户标识,必要)
当你安装 Git 后首先要做的事情是设置你的用户名称和 e-mail 地址。这是非常重要的,因为每次 Git 提交都会使用该信息。它被永远的嵌入到了你的提交中
|
只需要做一次这个设置,如果你传递了 --global 选项,因为 Git 将总是会使用该信息来处理你在系统中所做的一切操作。如果你希望在一个特定的项目中使用不同的名称或 e-mail 地址,你可以在该项目中运行该命令而不要 --global 选项。 总之--global为全局配置,不加为某个项目的特定配置。
2. 从本地到远程
项目开发的时候,有时候是先在本地建一个项目,再提交到远程仓库的。
- 创建项目目录(或通过 IDE 创建),命令行 cd 到项目目录
- 执行 git init , 将在项目目录创建 .git 目录
- 执行 git add * ,将所有文件添加到暂存区,这里要先创建一个 .gitignore 文件,将不需要版本维护的文件添加进去忽略,不然各种 IDE 编译文件夹,环境相关文件都加到版本库去了。删除文件用 git rm file_name
- 执行 git commit -m "upload project" ,提交到本地仓库
- 在 gitlab 或 github 上创建一个仓库,并将仓库地址复制下来
- 执行 git remote add origin git@server-name:path/repo-name.git ,关联远程仓库,仓库地址如果是 http 开头则要用户名密码,如果是 git 开头,则是走的 ssh 协议,需要将你本机的 ssh 公钥添加到远程仓库服务上。
- 执行 git push -u origin master ,推送本地仓库内容到远程仓库
这样在远程仓库目录,就能看到你提交上去的文件内容了。
3. 从远程到本地
更多的时候,是远程仓库已有项目了,需要下载到本地开发
- git clone git@server-name:path/repo-name.git , 将远程仓库的内容下载到本地,这里仓库地址的处理同上
- 修改内容
- git add * ,将修改的内容添加到暂存区
- git commit -m "fix xxx issue" ,提交到本地仓库
- git push -u origin master , 推送本地仓库内容至远程仓库
版本回退
有时候改了文件,想反悔怎么办,git 给你“后悔药”。
单个文件的还原:
- git checkout file_name ,丢弃工作区的修改,还原到上次提交(commit)的版本,
- git reset HEAD file_name ,把暂存区的修改撤销掉(unstage),重新放回工作区。即还原到上次添加到暂存区(add)的版本
这里涉及几个场景
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout file_name。
- 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时(执行了 add,但没执行 commit),想丢弃修改,分两步,第一步用命令 git reset HEAD file_name,就回到了场景1,第二步按场景1操作。
- 场景3:已经提交了不合适的修改到版本库时,想要撤销本次的全部提交,参考下面的整个版本的还原,不过前提是没有推送到远程库。
整个版本的还原:
- git reset --hard HEAD^^, 回退到上上个版本
- git reset --hard 3628164, 回退到具体某个版本 3628164 是具体某个 commit_id 缩写
找不到 commit_id? git reflog 可查看每一个命令的历史记录,获取对应操作的 commit_id。git log [--pretty=oneline], 可查看 commit 记录
上一个版本就是 HEAD^,上上一个版本就是 HEAD^^,往上 100 个版本写成 HEAD~100。3628164 是具体某个 commit_id,不需要写全,只需要唯一确定就行,可往前进也可往后退。(git windows2.20.1 版貌似不支持对 HEAD^ 的操作)
多人协作
- 首先,可以试图用 git push origin branch_name 推送自己的修改;
- 如果推送失败,则因为远程分支比你的本地更新,需要先用 git pull 试图合并;
- 如果合并有冲突,则手动解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用 git push origin branch-name 推送就能成功!
如果 git pull 提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令 git branch –set-upstream branch-name origin/branch-name
在本地创建和远程分支对应的分支,使用 git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致
分支管理
平时开发时需要创建子分支来实现你的功能模块,然后再合并到主分支中。
- git checkout -b your_branch_name , 创建并切换分支
- git branch , 查看分支,标有*号表示当前所在分支
- git merge dev , 合并指定 dev 分支到当前分支
- git merge --no-ff -m "merge with no-ff" dev , 合并分支并生成commit记录
- git branch -d dev , 删除分支
git checkout -b dev = git branch dev + git checkout dev
Fast-forward 合并,“快进模式”,也就是直接把 master 指向 dev 的当前提交,所以合并速度非常快。存在冲突的不能 fast forward。git merge --no-ff -m "merge with no-ff" dev Fast forward 模式下,删除分支后,会丢掉分支信息。如果强制禁用 Fast forward 模式,Git 就会在 merge 时生成一个新的 commit,这样,从分支历史上就可以看出分支信息
标签管理
当发布版本时,一般需要对当前版本进行标签记录,以便后续进行版本查看或回退。
- git tag tag_name , 对当前分支打标签
- git tag , 查看所有标签
- git tag v0.9 6224937 ,针对某个具体 commit id 打标签
- git show tag_name , 查看标签信息
- git tag -a v0.1 -m "version 0.1 released" 3628164 , 带有说明的标签
- git tag -d v0.1 , 删除标签
- git push origin tag_name , 推送标签到远程
- git push origin --tags , 一次性推送所有标签
删除已经推送到远程的标签:
- git tag -d v0.9 , 先本地删除
- git push origin :refs/tags/v0.9 , 然后从远程删除
提高效率的 Tips
配置命令别名
# 查看系统config |
git config --global alias.st status # 后面可以用 git st 来代替 git status 了 git config --global alias.ck checkout # 后面可以用 git ck 来代替 git checkout 了 git config --global alias.cm 'commit -m' # 后面可以用 git cm 来代替 git commit -m 了 |
git pull origin master 或 git push origin master, 可直接 git pull 或 git push, 如果出现“no tracking information”的提示,则说明本地分支和远程分支的链接关系没有创建,用命令 git branch --set-upstream-to=origin/master master 建立关联即可。