zoukankan      html  css  js  c++  java
  • Git

    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 origin/

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

    标签管理

    在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。

  • 相关阅读:
    【More Effective C++ 条款4】非必要不提供default constructor
    【More Effective C++ 条款3】最好不要以多态方式处理数组
    【C++】Debug模式和Release模式的区别
    【More Effective C++ 条款2】最好使用C++转型操作符
    【More Effective C++ 条款1】仔细区别pointers和references
    程序崩溃时的堆栈捕捉
    快速排序--来自维基百科
    十六进制转为字符串
    linux那些事
    svnsync备份
  • 原文地址:https://www.cnblogs.com/LTEF/p/9757058.html
Copyright © 2011-2022 走看看