git的简单使用

git的简单使用

Git是什么?

Git是目前世界上最先进的分布式版本控制系统(没有之一)。

创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:


pwd命令用于显示当前目录。在我的Windows上,这个仓库位于/d/phpStudy/WWW/Git/ku

git简单命令

初始化一个Git仓库,使用git init命令。

添加文件到Git仓库,分两步:

使用命令git add ,注意,可反复多次使用,添加多个文件;
使用命令git commit -m ,完成。

要随时掌握工作区的状态,使用git status命令。
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。commit_id(版本号),可以不用全部写下来。
回到上个版本git reset --hard HEAD^
回到上个版本git reset --hard HEAD^^
当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上
–pretty=oneline参数:git log --pretty=oneline

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的ku文件夹就是一个工作区:
git工作区
版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

版本库
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

每次修改,如果不用git add到暂存区,那就不会加入到commit中。

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – <文件名>

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <文件名>,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退git reset --hard commit_id,不过前提是没有推送到远程库。

删除文件
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了

确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

git checkout – test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!

命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

远程仓库

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
在这里插入图片描述
点“Add Key”,你就应该看到已经添加的Key:
在这里插入图片描述
“有了远程仓库,妈妈再也不用担心我的硬盘了。”——Git点读机

添加远程仓库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。

首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
在这里插入图片描述
目前,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。

现在,我们根据GitHub的提示,在本地的learngit仓库下运行命令:

$ git remote add origin git@github.com:michaelliao/learngit.git

要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

关联后,使用命令git push -u origin master第一次推送master分支的所有内容;

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!

从远程库克隆

如果有多个人协作开发,那么每个人各自从远程克隆一份就可以了。

你也许还注意到,GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。

Git支持多种协议,包括https,但ssh协议速度最快。

分支管理

在这里插入图片描述
Git鼓励大量使用分支:

查看分支:git branch
git branch命令会列出所有分支,当前分支前面会标一个*号。

创建分支:git branch <名字>

切换分支:git checkout <名字> 或者 git switch <名字>

创建+切换分支:git checkout -b <名字> 或者 git switch -c <名字>
git checkout命令加上==-b==参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

合并某分支到当前分支:git merge <名字>

删除分支:git branch -d <名字>

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

git log --graph命令可以看到分支合并图。

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;

在master分支上修复的bug,想要合并到当前dev分支,可以用
git cherry-pick命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

开发一个新feature,最好新建一个分支;
git switch -c feature-vulcan
如果要丢弃一个没有被合并过的分支,可以通过git branch -D强行删除。

多人协作的工作模式通常是这样:

1.首先,可以试图用==git push origin<branch-名字>==推送自己的修改;

2.如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

3.如果合并有冲突,则解决冲突,并在本地提交;

4.没有冲突或者解决掉冲突后,再用==git push origin <branch-名字>==推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/远程分支名 本地分支名

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

查看远程库信息,使用git remote -v

本地新建的分支如果不推送到远程,对其他人就是不可见的;

从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

建立本地分支和远程分支的关联,使用git branch --set-upstream-to origin/远程分支名 本地分支名

从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

git rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;

rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

命令git tag <tag名字>用于新建一个标签,默认为HEAD,也可以指定一个commit id
用==git show <tag名字>==查看标签信息:

命令==git tag -a <tag名字> -m “blablabla…”==可以指定标签信息;

命令git tag可以查看所有标签。

命令==git push origin <tag名字>==可以推送一个本地标签;

命令git push origin --tags可以推送全部未推送过的本地标签;

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除
命令==git tag -d <tag名字>可以删除一个本地标签;
然后,从远程删除。删除命令也是push,但是格式如下
命令
git push origin :refs/tags/<tag名字>==可以删除一个远程标签。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值