码迷,mamicode.com
首页 > 其他好文 > 详细

Git

时间:2018-10-08 21:36:05      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:自己   直接   控制系统   为我   auto   ack   好的   some   最新版   

Git是分布式版本控制系统。如果你和同事同时修改了A文件,那么只需要把A文件的修改推送给对方就可以了。

Svn,Cvs是集中式版本控制系统。需要联网才能工作。从中央服务器下载最新代码,并把修改上传到中央服务器。

和集中式版本控制系统相比,Git分布式版本系统的安全性要高得多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏了可以从其他人那里复制。而集中式版本库的中央服务器挂了,所有人都无法工作。

版本库(repository):版本库中的所有文件都可以被Git管理起来,每个文件的修改、删除 Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻“还原”。

创建版本库:

1. 在要创建git版本库的文件夹上执行命令: git init

命令执行完成后,会看到一个.git目录,默认是隐藏的。

把文件添加到版本库:

文件建议使用编辑器,如NotePad++书写。方便修改编码方式 --UTF-8

添加文件到仓库命令:
    git add test.txt

文件提交到仓库命令:
    git commit -m "add a txt"   -- 会提交git跟踪到的所有修改文件

退回版本库:

查看仓库当前的状态状态命令:
    # 这个命令可以告诉我们有哪些文件被修改了,哪些文件被删除了等等
    git status

查看具体修改内容:
    git diff test.txt

查看提交信息:
    git log

退回版本:
    git reset -hard HEAD^  -- ^代表退回上一个版本
    git reset -hard ~100   -- ~100往上一百个版本

每次commit都会自动生成一个id,也可以使用id退回版本
    git reset -hard 1094a

Git版本退回非常快,因为Git在内部有一个指向当前版本的指针,当你退回版本的时候,Git仅仅是把HEAD指针指向了其他版本。

注:当退回版本以后,git log只能查看可以回退的版本,不能查看向前的版本,如果向要查看,要使用 git relog查看所有的提交命令

Git工作区、暂存区:

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

版本库:隐藏目录.git

git版本库中存贮了很多信息,其中最重要的就是stage的暂存区,还有Git为我们建立的第一个分支master,以及指向master的HEAD

git add、git commit命令含义:

git add 实际就是把文件修改添加到暂存区;
git commit 实际就是把暂存区的所有内容提交到当前分支。

Git修改文件:

第一次修改 -> git add -> 第二次修改 -> git add -> git commit

Git撤销修改:

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

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

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

Git删除文件:

删除文件后运行命令
git rm <file>
git commit

若删除文件后发现删错了
git checkout -- <file>  把误删的文件修改到最新版本

Git分支:

创建分支,并切换
git checkout -b dev

git checkout -b dev 相当于:
    git branch dev  创建
    git checkout dev  切换

查看当前分支
git branch

创建之后我们就可以在dev分支上正常提交

dev分支工作完成时,我们就可以切换回master分支,进行合并

git checkout master
git merge dev

合并完成后,我们就可以删除dev分支了

git branch -d dev

提交冲突

当dev分支提交的修改和master分支提交的修改有冲突时,需要我们手动合并修改,再次提交。

查看分支合并图
git log --graph --pretty=oneline --abbrev-commit

分支管理

分支合并后、删除dev分支会丢失分支信息。使用 --no-ff保存分支信息。

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

Bug分支

当工作中出现bug需要马上解决,但是手动新的代码还不能提交,可以使用stash功能。

当分支中stash一下,假设当前分支为dev
git stash

切换到需要修改bug的分区
git checkout master

创建修改bug分支
git checkout -b issue-101

提交
git add readme.txt 
git commit -m "fix bug 101"

合并
git checkout master
git merge --no-ff -m "merged bug fix 101"

切换到原分支工作区
git checkout dev

查看当前stash
git stash list

把缓存的dev分支上的修改找回
git stash apply

删除stash
git stash drop

或者直接使用pop恢复并删除stash
git stash pop

Feature分支

分支上的修改没有合并时,若想删除改分支,执行以下命令

git branch -D <name>

多人协作

当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

要查看远程库的信息,用git remote:

git remote

或者,用git remote -v显示更详细的信息:

git remote -v

推送分支

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:

git push origin master

推送到其他分支
git push origin dev

抓取分支

克隆git项目
git clone git@github.com:michaelliao/learngit.git

当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。不信可以用git branch命令看看

$ git branch
* master

现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:

$ git checkout -b dev origin/dev

现在,他就可以在dev上继续修改,然后,时不时地把dev分支push到远程:

$ git add env.txt

$ git commit -m "add env"
[dev 7a5e5dd] add env
 1 file changed, 1 insertion(+)
 create mode 100644 env.txt

$ git push origin dev
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 308 bytes | 308.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
   f52c633..7a5e5dd  dev -> dev

你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送:

$ cat env.txt
env

$ git add env.txt

$ git commit -m "add new env"
[dev 7bd91f1] add new env
 1 file changed, 1 insertion(+)
 create mode 100644 env.txt

$ git push origin dev
To github.com:michaelliao/learngit.git
 ! [rejected]        dev -> dev (non-fast-forward)
error: failed to push some refs to ‘git@github.com:michaelliao/learngit.git‘
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: ‘git pull ...‘) before pushing again.
hint: See the ‘Note about fast-forwards‘ in ‘git push --help‘ for details.

推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:

$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> dev

git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:

$ git branch --set-upstream-to=origin/dev dev
Branch ‘dev‘ set up to track remote branch ‘dev‘ from ‘origin‘.

再pull:

$ git pull
Auto-merging env.txt
CONFLICT (add/add): Merge conflict in env.txt
Automatic merge failed; fix conflicts and then commit the result.

这回git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push:

$ git commit -m "fix env conflict"
[dev 57c53ab] fix env conflict

$ git push origin dev
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 621 bytes | 621.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
   7a5e5dd..57c53ab  dev -> dev

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

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

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

  • 没有冲突或者解决掉冲突后,再用git push origin

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

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

标签管理

在Git中打标签非常简单,首先,切换到需要打标签的分支上:

git branch

然后,敲命令git tag

git tag v1.0

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

git tag

默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?

方法是找到历史提交的commit id,然后打上就可以了:

git log --pretty=oneline --abbrev-commit

git tag v0.9 f52c633

注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show

git show v0.9

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

git tag -a v0.1 -m "version 0.1 released" 1094adb

操作标签

如果标签打错了,也可以删除:

git tag -d v0.1

如果要推送某个标签到远程:

git push origin v1.0

或者,一次性推送全部尚未推送到远程的本地标签:

git push origin --tags

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

git tag -d v0.9

git push origin :refs/tags/v0.9

使用git

别人好的项目先fork到自己的仓库,再clone到本地。

如果你想修复bootstrap的一个bug,或者新增一个功能,立刻就可以开始干活,干完后,往自己的仓库推送。

如果你希望bootstrap的官方库能接受你的修改,你就可以在GitHub上发起一个pull request。

Git

标签:自己   直接   控制系统   为我   auto   ack   好的   some   最新版   

原文地址:https://www.cnblogs.com/LTEF/p/9757058.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!