Git学习

创建GIT

  • --global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
  • 查看已有的配置信息
git config --list   
  • 创建空目录
mkdir learngit
cd learngit
  • 将这个目录变成Git可以管理的仓库
git init
  • 将文件放到Git仓库
git add readme.txt
git commit -m "wrote a readme file"

掌握仓库当前的状态

  • git status告诉你是否有文件被修改过
git status
  • git diff可以查看修改内容,difference
git diff readme.txt
  • 版本控制系统查看历史记录   
git log
git log --pretty=oneline
  • 记录你的每一次命令,以便确定要回到未来的哪个版本。
git reflog

时光鸡

  • 返回上一个版本
git reset --hard HEAD^
  • 返回指定版本
git reset --hard 1094a
  • 撤销工作区的修改   
git checkout -- readme.txt

  如果git add到暂存区后,则需要以下

git reset HEAD readme.txt
git checkout -- readme.txt
  • 删除文件

  确实需要删除

git rm test.txt
git commit -m "remove test.txt"

  误操作删除了原文件

git checkout -- test.txt

远程仓库

  • 创建SSH Key,保持默认即可,并与github建立连接
ssh-keygen -t rsa -C "youremail@example.com"

  x:\Users\xxx\.ssh目录下id_rsa(私钥)和id_rsa.pub(公钥)两个文件,以下建立连接
  登陆GitHub>>“Account settings”>>“SSH Keys”>>Add SSH Key,Key文本框里粘贴id_rsa.pub文件的内容

  • 创建远程仓库并与本地关联,michaelliao---GitHub账户名

  登陆GitHub>>reate a new repo>>Repository name填入learngit

  本地输入以下命令与远程端关联,michaelliao为用户自己的账户名;origin 为本地远程命名,如果用户不单是Github一个远程端,还有自己建立的远程端,则另外命名一个;learngit.git则是自己前面填写的learngit

git remote add origin git@github.com:michaelliao/learngit.git
  • 把本地库的所有内容推送到远程库上
git push -u origin master

  以后需要本地提交用以下命令即可

git push origin master
  •  第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:

    '''
    The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
    RSA key fingerprint is xx.xx.xx.xx.xx.
    Are you sure you want to continue connecting (yes/no)?
    '''

  • 从远程仓库克隆

  登陆GitHub>>创建一个新的仓库>>勾选Initialize this repository with a README
  在本地把远程仓库克隆过来

git clone git@github.com:michaelliao/gitskills.gi

分支管理

  • 创建与合并

  创建切换一个分支<name>:以下命令相当于两个命令git branch <name>git checkout <name>

git checkout -b <name>

  查看当前分支,标 * 的为当前分支

git branch

        将文件放到当前分支中

git add readme.txt
git commit -m "branch test"

        <name>分支的工作完成,我们就可以切换回master分支:

git checkout master

        把<name>分支的工作成果合并到现在的分支上:

git merge <name>

  删除分支

git branch -d <name>
  • 分支冲突

  当同时修改同一个文件,并且内容不相同时,在分支合并时提示冲突

        feature1分支合并时,Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交

git merge feature1

        '''
        Auto-merging readme.txt
        CONFLICT (content): Merge conflict in readme.txt
        Automatic merge failed; fix conflicts and then commit the result.
        '''
  GIT也可以告诉我们冲突的文件

git status

        '''
        On branch master
        Your branch is ahead of 'origin/master' by 2 commits.
          (use "git push" to publish your local commits)

        You have unmerged paths.
          (fix conflicts and run "git commit")
          (use "git merge --abort" to abort the merge)

        Unmerged paths:
          (use "git add <file>..." to mark resolution)

            both modified:   readme.txt

        no changes added to commit (use "git add" and/or "git commit -a")
        '''
        #查看冲突的文件,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
        '''
        <<<<<<< HEAD
        Creating a new branch is quick & simple.
        =======
        Creating a new branch is quick AND simple.
        >>>>>>> feature1
        '''
        #修改冲突的内容后再度提交
        git add readme.txt
        git commit -m "conflict fixed"
        #用带参数的git log也可以看到分支的合并情况
        git log --graph --pretty=oneline --abbrev-commit
        #删除分支
        git branch -d feature1
    #分支策略  
        首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
        干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
        你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了
    #Bug分支
        #Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
        git stash
        #确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支
        git checkout master
        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" issue-101
        #“储藏”工作现场查看
        git stash list
        #工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
        #1
        git stash apply
        git stash drop
        #2
        git stash pop

        #dev是从master上分出来的,也即dev上也有同样的bug,以下是快速将bug解决方案应用到dev中
        #Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支
        git cherry-pick 4c805e2

    #Feature分支
        #新功能分支管理
        git checkout -b feature-vulcan
        git add vulcan.py
        git status
        git commit -m "add feature vulcan"
        #切回dev,准备合并:
        git checkout dev
        #当新功能不需要时,由于这个包含机密资料的分支必须就地销毁:
        git branch -d feature-vulcan    
        git branch -D feature-vulcan    #-D强制删除
    #多人协作
        #查看远程库的信息
        git remote
        git remote -v
        #推送分支,指定本地分支
        git push origin master
        #分支推送管理
        但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
            master分支是主分支,因此要时刻与远程同步;
            dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
            bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
            feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
#标签管理
    #Git的标签虽然是版本库的快照,但其实它就是指向某个commit id的指针,tag就是一个让人容易记住的有意义的名字
    #切换到需要的标签页
    git checkout dev
    #设置标签,默认是打在最近一次commit上
    git tag v1.0
    #查看所有标签
    git tag
    #忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?方法是找到历史提交的commit id,然后打上就可以了
    git log --pretty=oneline --abbrev-commit
    git tag v0.9 <commit id>
    #指定标签信息
    git tag -a <tagname> -m "blablabla..."

    #删除错误标签
    git tag -d v0.1    
    #推送某个标签到远程
    git push origin <tagname>
    #一次性推送全部尚未推送到远程的本地标签:
    git push origin --tags
    #从远程删除。删除命令也是push,但是格式如下:
    git push origin :refs/tags/<tagname>

#自定义Git    
    git config --global color.ui true
#忽略特殊文件
    #在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
    '''
    忽略文件的原则是:

    1.忽略操作系统自动生成的文件,比如缩略图等;
    2.忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
    3.忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件
    '''
    #如果你确实想添加该文件,可以用-f强制添加到Git
    git add -f App.class
    #或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:
    git check-ignore -v App.class
#配置别名
    git config --global alias.st status
    #配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

#搭建Git服务器,ubuntu
    #第一步,安装git
    sudo apt-get install git
    #第二步,创建一个git用户,用来运行git服务
    sudo adduser git
    #第三步,创建证书登录
    收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
    #第四步,初始化Git仓库:先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令
    sudo git init --bare sample.git
    #第五步,禁用shell登录:出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行
    git:x:1001:1001:,,,:/home/git:/bin/bash   ->   git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
    #第六步,克隆远程仓库:可以通过git clone命令克隆远程仓库了
    git clone git@server:/srv/sample.git


posted @ 2019-09-09 09:34  一了然  阅读(96)  评论(0)    收藏  举报