微信扫一扫

028-83195727 , 15928970361
business@forhy.com

Git基本使用方法

git2016-10-28

1、初始化一个git目录:git init, 然后就可以在这个目录中进行一系列的git操作。如果是拷贝(这里不是指Clone)别的项目,并且里面带有.git目录,那么就删掉这个文件夹。然后在这个目录下初始化自己的.git

2、关联远程库,如果没有的话就创建一个

$git remote add origin git@server-name:path/repo-name.git 关联远程库
$git push -u origin master   第一次推送master分支的所有内
$git push origin master     此后,每次本地提交后,只要有必要,就可以使用命令

3、
把自己的一个目录初始化成一个git目录后,并在github上创建了一个项目,并且将两者关联了起来,当使用

$git pull 

的时候,会出现 fatal: refusing to merge unrelated histories ,这是加一个参数变成

$git pull --allow-unrelated-histories

就可以了。
4、常用命令:

git diff :可以看到在git add <files>最近两次所对文件做的每次修改差别
git status 提示修改什么文件,
git checkout -- <file>可以将文件恢复到最近的add或者是commit前的状态,也就是说,如果你的文件在工作区中没有将修改放到stage区中,那么就会恢复到和版本一模一样的状态,如果是已经在暂存区了,
    又做了修改那么就会恢复到添加到暂存区之后的状态。
git add <file1> <file2>..
git commit -m "your note here"  :“必须”要有后面的note
git log:查看到从从远到近的修改信息,可以根据里面的commit id 来恢复文件
git reset --hard HEAD^ :用来恢复到上一个版本,恢复几次就可以写几个^,另外可以使用HEAD~10这样的形式来恢复几次,这里是10次(最多恢复到第一个版本,若在第一个版本的基础上继续恢复会报错的)\
git reset --hard commit_id:恢复到指定版本,另外commit_id不用写全
git reflog,查看命令历史,可以确定回到后面的某个版本
git status 提示 
        untracked:是这个文件从来没有add过,
        unstaged:这个文件被add,经过了修改
git add 是要提交放在stage区,git commit是将stage的东西提交到分支中这里默认是(master),如果全部提交了那么stage就是空的,git status就是什么都没有
将本地已有的库推送到github上面,前题是github上有名字叫做你要上传的repository,如果没有的话就在上面新建一个:
$git remote add origin(这个是代表这个远程repository,进行push的时候可以用origin来代替后面的这些东西) git@github.com:yudianer/learngit.git
$git push -u origin master(把前台的master分支推送到远程,由于远程是空的,第一次推送master分支的时候要加上-u 
                            ,git不但会把本地的master分支推送到远程上还会将两者关联起来,在以后推送或者拉取的时候就可以简化命令了,以后提交的时候就可以$git push origin master

 所以关联远程库是:$git remote add origin git@server-name:path/repo-name.git
                          $git push -u origin master   第一次推送master分支的所有内
                          $git push origin master     此后,每次本地提交后,只要有必要,就可以使用命令


git clone <repository address>: git clone git@github.com:yudianer/gitskills.git
                                    git clone https://github.com/yudianer/gitskills.git
        git clone可以用https协议和git协议,但是git协议比较快,https协议比较慢

分支处理:
            查看分支:git branch

            创建分支:git branch <name>

            切换分支:git checkout <name>

            创建+切换分支:git checkout -b <name>

                    这样默认是fast forward模式合并,而fast forward合并就看不出来曾经做过合并。

                    --no-ff:合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

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

            删除分支:git branch -d <name>


分支策略:
    master分支应该是最稳定的,只用来进行
    dev分支用来合并其他用户分支
    其他用户做的修改merge到dev分支上,最后dev分支merge到master上

    --no-ff:合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

Bug分支(stash功能,git stash,stash之后工作区就变成干净的了,所以git status看不到任何东西,需要使用git stash list查看现场情况):
            当正在一个分支上工作时突然接收到一个命令去作别的工作,例如去改bug,但是现在的工作又不到时候提交,那就需要先把手头的事情先stash起来等到改完bug之后再回来接着做

            例如要先去master分支上去修改bug,那么就从master上创建临时分支(git branch -b issue-101),修改完毕并commit之后合并到master分支上之后,删掉issue-101分支,然后切换到之前的分支上继续工作
            $ git stash list 查看工作现场情况,

                恢复现场:
                        $ git stash apply [指定的stash]:恢复现场之后,stash中还有内容,可以使用git stash drop删除
                        $ git stash pop:在恢复的同时,吧stash内容也删除掉

feature分支(用来彻底删除没有合并的分支):git branch -D <branch name>

                                    比如现在在一个分支上工作,突然这个分支没有用了,那就没有必要合并,而是要彻底删除这个分支


和远程分支建立关联:在将本地的分支推送到远程的时候先要,和远程分支建立关联;如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建

            git branch --set-upstream branch-name origin/branch-name

想要在某个分支,例如dev,上工作,就必须创建远程original的dev到本地:

            git checkout -b branch-name origin/branch-name

从本地推送分支:

            git push original branch-name

在推送的时候可能遇到冲突使用

        git pull解决冲突

远程协作模式:

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

        首先,可以试图用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。

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



克隆到本地默认是master分支,如果想要在其他的分支上开发的话就需要使用上面的 git checkout -b branch-name origin/branch-name
添加远程库 :
git remote add origin git
标签管理:一个标签就是对应着一个commit id,由于这个id太长不好记,所以就利用tag来找commit id

            添加标签:

                $ git tag v1.0              :对所在分支的最近的一次commit上添加标签v1.0

                $ git tag v1.0 <commit_id>  :在这个id上面打上标签

                $ git tag -a v1.0 -m "version 0.1 is released" <commit id>  :在指定的commit id上打上标签并且写上说明文字 

                $ git tag -s v0.2 -m "version 0.1 is released" <commit id>  :标签采用PGP签名,就是使用私钥签名,相当于按指纹

                $ git tag :查看所有标签,但是标签是按照字母排序的

                $ git show <tag name>  : 可以看到标签的说明、PGP签名等信息

            推送标签:

                $ git push origin <tagname>可以推送一个本地标签;

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

            删除标签:

                $ git tag -d <tagname>可以删除一个本地标签;

                $ git push origin :refs/tags/<tagname>可以删除一个远程标签。
--------------------

    小结:

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

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

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

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

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

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