« 上一篇下一篇 »

git笔记

一、git是什么

git 是一个分布式版本控制系统。白话文翻译就是,你在一个文件夹内的所有操作,都可以像操作虚拟机的快照一样,随时备份随时恢复。虚拟机快照有分支功能,git 也有这个功能!而且功能更加强大。还能上传到云,让其他人一起来编辑文件夹内的所有文件。这个文件夹就叫做仓库。

下面的操作基本上囊括了所有常用的操作。本地仓库,远程仓库,以及本地仓库与远程的推送下拉,分支新建合并删除操作。开发时 master 分支为稳定版本,dev 版本为开发版本 ,开发人员各自从dev 分支拉取新建分支,解决问题用issue分支 ,用git stash 暂存现场,git 是个非常棒的版本库工具,可以说是团队协作的绝世好工具吧。

二、本地操作

1、安装 git

安装 git-for-windows,需要 windows vista 以上系统 ,到 https://git-for-windows.github.io/ 这个网站下载安装。安装完成后,打开 开始菜单 -- Git -- Git Bash ,打开一个命令行窗口,就算安装成功了。

2、配置 git

安装完成后,需要配置下(笔者电脑为 vmware-win7x86),

配置 git bash 主目录:右击 我的电脑 -- 属性 -- 高级系统设置 -- 选项卡 高级 -- 环境变量 :在上面的用户变量里面新建一个变量 名称为 HOME ,值为 d:\git-repository 。(笔者设置的git bash 主目录为 d:\git-repository)

配置用户名:例如下面是我的 git 配置,我的用户名 holyan ,我的邮箱 holyan@qq.com 。有这两项配置,可以精确区分每一个人了。

$ git config --global user.name "holyan"

$ git config --global user.email "holyan@qq.com"

查看用户名或者邮箱的方法为

$ git config user.name

$ git config user.email

创建SSH Key:

$ ssh-keygen -t rsa -C "holyan@qq.com"

这时在主目录生成.ssh目录,里面有 id_rsa 和 id_rsa.pub 两个文件,前面是私钥 ,后面是公钥。

把公钥传播出去!比如放到 github 里。就可以与 github 进行远程操作了。

3、创建一个本地仓库

接上面继续操作,在 git bash 的命令行窗口里,输入 pwd 命令回车,可以看到当前所在路径。

我们首先切换到想要创建仓库的地方,比如 d:\git-repository, 那么就在命令行内输入 cd /d/git-repository 后回车。cmd 命令为 cd /d d:\git-repository

然后输入命令 mkdir gitlearn 命令回车,来创建一个 gitlearn 文件夹。

进入这个文件夹,cd gitlearn

再输入 git init 命令来初始化这个仓库。这个命令会在 gitlearn 这个文件夹内创建一个 .git 的隐藏目录,这个目录不许碰。并且会生成一个 master 的主分支。

4、新建一个文件,并提交

继续接上面的操作,在 gitlearn 这个文件夹里,用 notepad++ 这个软件新建一个 readme.txt 文档,不要用 windows 自带的记事本来创建文件,因为不好用。里面录入 hello world 这几个字。

再回到 git bash,输入 git add readme.txt 回车

这时可以用 git status 来查看状态

再使用 git commit -m 'creat new file' 来提交到仓库

继续修改 readme.txt 文件 ,然后使用 git diff 来查看修改 ,再使用 git add readme.txt 和 git commit -m 'edit readme' 来提交修改到仓库

5、版本回退

git 中用 HEAD 表示当前版本。上一个版本就是 HEAD^ ,再上一个版本是 HEAD^^ ,前面10个版本可以写成 HEAD~10 

回退的命令是 git reset --hard HEAD^

如果知道 commitid,可以直接使用 commitID 回退。git reset --hard commitID

用 git log 查看版本号

用 git reflog 查看操作记录

6、git checkout -- readme.txt   回退 readme.txt 到上一次状态,未 git commit 的操作。

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。

7、删除恢复文件

新建一个文件 test.txt 并提交到仓库

删除文件使用 rm test.txt

如果是误删,可以使用 git checkout -- test.txt 来恢复

如果确定删除,使用 git rm test.txt 来删除,然后使用 git commit -m 'rm test' 提交到仓库。

三、远程仓库 github

1、首先在 github 创建一个帐号,并打开上面 git 配置里的 id_rsa.pub 文件,把公钥复制到 github 的 setting 里的 ssh 里(新建一个 ssh)。

2、推送:新建一个仓库,名称为 gitlearn ,随后 github 会提示连接这个仓库的方法。这里使用第二种方法:本地仓库推送到远程仓库。

a、create a new repository on the command line

echo "# gitlearn" >> README.md

git init

git add README.md

git commit -m "first commit"

git remote add origin git@github.com:dhchangan/gitlearn.git

git push -u origin master

b、push an existing repository from the command line

git remote add origin git@github.com:dhchangan/gitlearn.git关联一个远程仓库,这里远程仓库默认名字是 origin

git push -u origin master推送 master 分支的所有内容,以后有更改使用 git push origin master 只有第一次推送加 -u 参数

c、import code from another repository

3、克隆:假如有一个项目在远程库,我想克隆到本地使用,就需要下面的方法:

首先定位到主目录,关闭git bash 后重新打开 git bash 就是在主目录。

然后使用命令 git clone git@github.com:dhchangan/gitskill.git  稍后可见主目录下生产一个新仓库 gitskill

建议使用 ssh 协议,速度快。

使用 git remote 查看远程分支

使用 git remote -v 查看远程分支详细信息

四、分支操作

1、创建分支、切换分支

git branch dev

git checkout dev

也可以合并成一句

git checkout -b dev

git branch查看分支,有*号标注的是当前分支

2、在分支内编辑提交文件

3、合并分支

首先切换到主分支

git checkout master

git merge dev 把 dev 分支合并到当前分支

git merge --no-ff -m "merge with no-ff"

4、删除分支

git branch -d dev

5、解决冲突

先创建 dev 分支 ,编辑修改提交文件 readme.txt

再切回 master 分支,编辑修改文件 readme.txt

合并分支 dev 到 master ,提示冲突。

解决方法:打开 readme.txt ,手动修改保存文件。然后提交。

然后使用 git log --graph 查看分支合并图。

6、暂存现场

当手头工作还没有完成,又必须马上解决另外一个问题的时候,不好提交commitid,因为万一提交了commitID,以后万一恢复到这里就是半成品问题了。这个时候用 git stash暂存现场,等完成了那个问题再回来恢复现场。

假设当前在dev分支工作

git stash 暂存现场

git checkout master 切换到其他分支解决问题

git checkout -b issue-1 从master分支新建一个专门解决问题的分支并切换到这个分支

git add readme.txt 

git commit -m 'issue readme bug'

git checkout master

git merge --no-ff -m "merged bug fix bug" issue-1

git branch -d issue-1

git checkout dev

git stash list

git stash apply 恢复现场,此时stash没有删除,用git stash list还能看到

git stash drop删除stash,此时用git stash list看不到了

git stash pop恢复现场并删除stash。这个语句替换上面2个语句。推荐用这个吧。

7、使用分支开发步骤:从dev创建新分支fea,开发功能,回到dev分支合并分支fea,删除fel分支

如果没有合并fea就使用 git branch -d fea 会提示没有合并不能删除,这时使用 git branch -D fea 强制删除

8、远程分支

先在本地创建分支 dev ,然后切换到分支,编辑文件提交后,再远程推送 dev 分支。

关联本地分支和远程分支的命令 git branch --set-upstream branch-name origin/branch-name

五、其他

1、.gitignore 文件内写入需要忽略 commit 的文件的名称,使用 #开头进行注释,git add -f 命名强制添加文件。另外.gitignore文件也要推送到版本库。

2、用 git tag v1.0 给当前版本打标签,所以建议先切换到需要打标签的分支和commitid。默认在最新提交的 commitid

用 git tag 命令查看当前所有标签,按照字母排序。

用 git show v1.0 查看标签详细信息

用 git log --pretty=oneline --abbrev-commit 命令查看 commitid 和 说明

用 git tag v1.2 commitid 在需要打标签的 commitid 打上标签

用 git tag -a v1.1 -m "version 1.1" 1234567  给 commitid 为 1234567 的地方打上标签 v1.1 并备注文字说明 version 1.1

用 git tag -d v1.0 删除标签名为 v1.0 的标签

用 git push origin --tags 推送所有标签

用 git push origin v1.0 推送单个标签

用 git push origin :refs/tags/v1.0 删除单个远程标签,需要先删除本地标签