git的简单使用

git 的下载
    https://git-scm.com

1.git是什么?
    主要做软件版本控制的。
    主要使用在团队协同开发当中。

2. 假设没有这种“软件版本控制器”,团队开发会出现什么问题?
    代码覆盖问题。

3. SCM 软件控制管理。
    常见的SCM包括:
        git
        svn

4. svn和git的区别?
    svn:集中式
    git: 分布式

5. git的工作结构,git是如何工作的?

    注意:所有的git命令都是以git这个单词开始的。
        git 命令....

    工作区
        当我们程序员自己编写的程序没有纳入git管理的话, 这个叫做代码处于工作区。
        处于工作区的代码其实表示和git还没有关系,只是在windows操作系统当中,还没有
        纳入git的管理。

        git add
        这个命令的作用是:将处于工作区的代码纳入git管理,进入暂存区。

        git add Hello.java 表示Hello.java被放到暂存区当中。(表示纳入git的管理。)

    暂存区
        处于暂存区的代码,表示仅仅纳入了git的管理,但是并没有传到本地库当中。

        git commit 
        这个命令的作用是:将处于暂存区的代码传到本地库当中。
        git commit Hello.java

    本地库

6. 代码最终提交到本地库之后,会生成一个新的版本号。
    所以在本地库当中有很多版本的代码。
    Hello.java v1
    Hello.java v2
    Hello.java v3
    Hello.java v4
    ........

    可以使用git来进行版本的随意切换。

7. 只有本地库的话,就是我们程序员自己玩自己的,没有办法协同开发。
    自己一个人开发一个项目,也是有必要使用git的。
    起码可以在本地库当中形成大量的版本,想回到哪个版本,也很轻松。
    当然自己一个人开发项目的话,远程库也有必要使用。
    (代码在托管中心上存储,存储到远程库中,更安全。)

8. 本地库和远程库的区别?
    本地库是一个git仓库。
    远程库也是一个git仓库。
    它们的区别是:
        一个是本地计算机上的。
        一个是外网的代码托管中心。
    
    外网的代码托管中心包括:
        github (创建远程的git仓库)
        gitee(创建远程的git仓库)
    
    Gitlab:使用这个软件可以自行搭建远程代码托管机制。

9. 初始化本地库
    第一步:创建一个crm目录
        D:\course\javaProject\07-Git\crm
        在crm目录下进行项目的开发。

        写一个Hello.java文件,并进行编辑。
    
    第二步:在crm目录下,右键“git bash here”打开git bash窗口,然后执行git init命令完成本地库初始化。
        如果在crm目录下开发,建议将crm目录作为本地库的根目录。

    注意:到此刻只能说明本地库初始化完成了。(本地库初始化完成有一个标志:.git目录存在的话表示成功)
    本地库虽然有了,但是Hello.java目前还在“工作区”,还没有到“暂存区”。

10. 查看git本地库的状态

    git status

    Administrator@powernode MINGW64 /d/course/javaProject/07-Git/crm (master)
    $ git status
    On branch master

    No commits yet

    Untracked files:
      (use "git add <file>..." to include in what will be committed)
              Hello.java

    nothing added to commit but untracked files present (use "git add" to track)

    以上Hello.java文件为红色,表示还没有纳入git的管理,表示还在工作区。

11. 将Hello.java纳入git管理,放到暂存区。
    git add Hello.java

    $ git status
    On branch master  (什么意思?目前在主分支上。master是“主”的意思。branch是“分支”的意思)

    No commits yet

    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)
              new file:   Hello.java
    
    这个时候:Hello.java文件是绿色。
    表示:在暂存区,但是没有提交到本地库

12. 可以将暂存区的文件删除吗?
    在暂存区表示文件已经纳入git管理。
    从暂存区中删除,表示这个文件又回到了工作区。和git没有关系了。
    git rm --cached Hello.java

    Administrator@powernode MINGW64 /d/course/javaProject/07-Git/crm (master)
    $ git rm --cached Hello.java
    rm 'Hello.java'

    Administrator@powernode MINGW64 /d/course/javaProject/07-Git/crm (master)
    $ git status
    On branch master

    No commits yet

    Untracked files:
      (use "git add <file>..." to include in what will be committed)
              Hello.java

    nothing added to commit but untracked files present (use "git add" to track)

    再重新放到暂存区。
    git add Hello.java

13. 将暂存区的代码提交到本地库。一旦要提交到本地库,会形成一个版本号。
    git commit Hello.java

    Administrator@powernode MINGW64 /d/course/javaProject/07-Git/crm (master)
    $ git commit Hello.java
    Author identity unknown

    *** Please tell me who you are.

    Run

      git config --global user.email "you@example.com"
      git config --global user.name "Your Name"

    to set your account's default identity.
    Omit --global to set the identity only in this repository.

    fatal: unable to auto-detect email address (got 'Administrator@powernode.(none)')

    注意:以上提交失败了,为什么?因为git不知道你是谁。git要必须知道这个提交人是谁,
    必须能够很好的区分开不同的开发人员。所以需要执行以下两个命令:(设置签名)

        设置git用户的唯一标识:全局方式。(系统级)
            git config --global user.email "随便写"    不用合法的邮箱可以吗?可以。最好使用邮箱。
            git config --global user.name "随便写"

            这种全局的系统级唯一标识,作用于这台电脑上所有的git本地库。

            全局的设置完成之后,在~/.gitconfig文件中有体现:
                [user]
                    name = bjpowernode
                    email = bjpowernode@123.com

        设置git用户的唯一标识:局部方式 (项目级)
            git config user.email "随便写"
            git config user.name "随便写"

            这种项目级唯一标识,作用于当前的git本地库。
            
            本地库级设置完成之后,在 本地库/.git/config 文件中有体现:
            [user]
                name = teacher
                email = teacher@123.com
        
        不设置,肯定不行,设置一个系统级可以,设置一个项目级也可以,
        同时设置系统级和项目级也可以,如果同时设置,“就近原则”,项目级起作用。


        怎么查看签名?
            git config --global user.name
            git config --global user.email
            git config user.name
            git config user.email

    现在设置好签名之后,能提交吗?可以 
        git commit Hello.java

        $ git commit Hello.java
        [master (root-commit) cbbf606] first commit,new file Hello.java
         1 file changed, 1 insertion(+)
         create mode 100644 Hello.java
        
        $ git status
        On branch master
        nothing to commit, working tree clean

14. 继续使用vim对文件Hello.java进行修改:
    
    Administrator@powernode MINGW64 /d/course/javaProject/07-Git/crm (master)
    $ vim Hello.java

    Administrator@powernode MINGW64 /d/course/javaProject/07-Git/crm (master)
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
              modified:   Hello.java

    no changes added to commit (use "git add" and/or "git commit -a")

    修改之后重新报红色。表示在工作区,没有纳入暂存区。
    
        Administrator@powernode MINGW64 /d/course/javaProject/07-Git/crm (master)
        $ git add Hello.java
        warning: LF will be replaced by CRLF in Hello.java.
        The file will have its original line endings in your working directory

        Administrator@powernode MINGW64 /d/course/javaProject/07-Git/crm (master)
        $ git status
        On branch master
        Changes to be committed:
          (use "git restore --staged <file>..." to unstage)
                  modified:   Hello.java

    add之后,文件为绿色。表示在暂存区,没有在本地库。

    提交到本地库:
        Administrator@powernode MINGW64 /d/course/javaProject/07-Git/crm (master)
        $ git commit -m "second commit, main method" Hello.java
        warning: LF will be replaced by CRLF in Hello.java.
        The file will have its original line endings in your working directory
        [master 8f57071] second commit, main method
         1 file changed, 3 insertions(+), 1 deletion(-)

15. 查看历史记录
    git log
        查看真实的变化记录。
    git log --pretty=oneline
        查看真实的变化记录,格式化一行。
    git log --oneline
        查看真实的变化记录,格式化一行,但是会取版本号的前几位。
    git reflog
        查看操作记录。
    
16. 版本的前进和后退
    
    第一种方式:索引值 (支持前进和后退)
        git reset --hard [部分索引值]

    第二种方式:^ (只支持后退)
        git reset --hard HEAD^
        git reset --hard HEAD^^
        git reset --hard HEAD^^^

    第三种方式:~ (只支持后退)
        git reset --hard HEAD~3
    
    git help reset 可以查看命令reset的帮助。

    关于reset命令的三个参数:
        git reset --hard [部分索引值]
        git reset --mixed [部分索引值]
        git reset --soft [部分索引值]

        * --soft     只改变本地库,暂存区和工作区不变。
        * --mixed    只改变本地库+暂存区,工作区不变。
        * --hard     工作区,暂存区,本地库都变。

    注意:
        怎么让本地库 、 暂存区、 工作区 变得一致?
            git reset --hard HEAD
            以本地库为标准,进行一致化。

17. 删除的文件怎么找回

    使用版本的后退可以找回删除的文件。

    $ rm -rf Hello.java
    $ git status
        On branch master
        Changes not staged for commit:
          (use "git add/rm <file>..." to update what will be committed)
          (use "git restore <file>..." to discard changes in working directory)
                  deleted:    Hello.java
    $ git add Hello.java
    $ git status
        On branch master
        Changes to be committed:
          (use "git restore --staged <file>..." to unstage)
                  deleted:    Hello.java

    $ git commit -m "delete file Hello.java" Hello.java

    回退版本就可以找回文件:
        $ git reset --hard 6e02eef

    
    删除文件怎么找回?
        两种情况:
            第一种情况:删除文件之后,这个删除的动作已经提交到本地库了。怎么恢复?
                git reset --hard [部分索引值]
            第二种情况:删除文件之后,这个删除的动作没有提交到本地库,只是工作区中的文件删除了,怎么恢复?
                git reset --hard HEAD

18. 查看文件的区别。(比较文件)

    第一种需求:查看工作区和暂存区的文件有什么区别(查看指定文件)?
        git diff [文件名]
    
    第二种需求:查看工作区和暂存区的文件有什么区别(查看所有文件)?
        git diff
    
    第三种需求:查看工作区和本地库中某个版本的区别?
        git diff [部分索引值] [文件名]

19. git分支

    默认创建的本地库,有一个默认的主干:branch master(主分支)

    新创建的分支:分支中的内容和主干的内容完全一致。(等于拷贝了主干一份。)

    假设我们团队有5个程序员:其中1个PM,4个coder
    假设项目的模块是5个模块:order订单模块,product商品模块.....
    一般情况下都是一个模块一个程序员负责,一个程序员一般对应一个分支。
    
    5个程序员5个模块,分支的总数量是:7个。

        master 主干

        hot_fix 热修复分支
        
        feature_order  订单分支
        feature_prduct 商品分支
        .....

20. 分支相关的命令

    注意:
        每一个分支都有自己的:工作区 暂存区  本地库。
    
    查看分支有哪些?
    $ git branch -v
    * master d187490 add ccccc

    创建分支,通过master这个主干分支创建一个子分支。(子分支刚创建的时候和主干内容是一致的。)
    $ git branch hot_fix (创建一个hot_fix分支。hot_fix分支和master分支内容一致。)

    $ git branch -v
      hot_fix d187490 add ccccc
    * master  d187490 add ccccc   (*以及绿色,表示当前所在的分支。)

    切换分支
    $ git checkout hot_fix
    Switched to branch 'hot_fix'

    分支合并(正常合并):
        第一步:在hot_fix分支上进行开发。
            vim Hello.java (修改了这个文件)

        第二步:在hot_fix分支上执行add
            git add Hello.java (将Hello.java添加到hot_fix分支的暂存区)

        第三步:在hot_fix分支上执行commit
            git commit -m "time8 commit, SystemOut7" Hello.java
            将Hello.java文件添加到hot_fix分支的本地库当中。

        第四步:将hot_fix分支正常合并到master分支上
            hot_fix分支合并到master分支上,第一步需要先切换到master分支上。
                git checkout master (hot_fix要合并到master上,需要master进行合并操作。)
                git merge hot_fix (将hot_fix分支合并到master上。)

    分支合并(合并时产生冲突):
        $ vim Hello.java
        $ git add Hello.java
        $ git commit -m "edit by hot_fix" Hello.java

        $ git checkout master

        $ vim Hello.java
        $ git add Hello.java
        $ git commit -m "edit by master" Hello.java

        $ git merge hot_fix
            Auto-merging Hello.java
            CONFLICT (content): Merge conflict in Hello.java
            Automatic merge failed; fix conflicts and then commit the result.
        
        $ vim Hello.java
        $ git add Hello.java
        $ git commit -m "解决冲突"   (注意:解决冲突的最后一个commit不要加文件名。)

        冲突解决了,不过master上是最新的。hot_fix怎么办?
            git checkout hot_fix
            git merge master

21. 注册github账号

        第一步:必须要有一个自己的邮箱。(建议使用aliyun的。)
            阿里个人邮箱:https://mailsso.mxhichina.com/

            邮箱地址和密码:
                邮箱:bjpowernode@aliyun.com
                密码:bjpowernode.

        第二步:github上的密码信息记录:
            dljd~~123
        
        第三步:github username
            bjpowernodegit
        
        第四步:生成Access Token
            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

            拥有以上token的表示同一个团队的人员。
        
22. 协同开发

    第一步:PM创建一个本地库。
        PM/oa/.git
        在这个创建文件,进行代码开发。
        vim Hello.java
        git add Hello.java
        git commit -m  "xxxx" Hello.java

    第二步:PM创建一个远程库(使用github向导创建即可)

    第三步:获取到远程库的地址
        https://github.com/bjpowernodegit/oa.git
    
    第四步:将本地库push到远程库
        git push https://github.com/bjpowernodegit/oa.git master

        第一次使用的时候,会提示你输入Access Token
    
    第五步:另一个开发人员进行clone(将远程库的代码下载一份,并且创建本地库)
        git clone https://github.com/bjpowernodegit/oa.git
    

23. 正常情况下,没有冲突的情况下,团队协同开发。

    第一:两个开发人员本地库的代码目前是一样的。

    第二:zhangsan修改代码,提交到本地库。
        vim Hello.java
        git add Hello.java
        git commit -m "xxxx" Hello.java

    第三:zhangsan将本地库的代码push到远程库(这里zhangsan是需要输入一个Access Token的。)
        git push https://github.com/bjpowernodegit/oa.git master

    第四(切换PM的身份):PM使用pull命令从远程库拉取最新代码到本地库。
        git pull https://github.com/bjpowernodegit/oa.git master


24. 非正常情况下,产生冲突的情况下,团队协同开发。
    
    第一:两个开发人员本地库的代码目前是一样的。

    第二:PM修改Hello.java,提交到本地库。

    第三:zhangsan修改Hello.java,提交到本地库。

    第四:PM使用push,将本地库推送到远程库。
        目前没有冲突。

    第五:zhangsan使用push,将本地库推送到远程库。
        有冲突了。

        $ git push https://github.com/bjpowernodegit/oa.git master
            To https://github.com/bjpowernodegit/oa.git
             ! [rejected]        master -> master (fetch first)
            error: failed to push some refs to 'https://github.com/bjpowernodegit/oa.git'
            hint: Updates were rejected because the remote contains work that you do
            hint: not have locally. This is usually caused by another repository pushing
            hint: to the same ref. You may want to first integrate the remote changes
            hint: (e.g., 'git pull ...') before pushing again.
            hint: See the 'Note about fast-forwards' in 'git push --help' for details.

    怎么解决冲突?
        站在zhangsan角度解决冲突问题。
        先pull,在push。

        pull的结果:
            $ git pull https://github.com/bjpowernodegit/oa.git master
            remote: Enumerating objects: 5, done.
            remote: Counting objects: 100% (5/5), done.
            remote: Compressing objects: 100% (1/1), done.
            remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
            Unpacking objects: 100% (3/3), 291 bytes | 48.00 KiB/s, done.
            From https://github.com/bjpowernodegit/oa
             * branch            master     -> FETCH_HEAD
            Auto-merging Hello.java
            CONFLICT (content): Merge conflict in Hello.java
            Automatic merge failed; fix conflicts and then commit the result.
        
        程序员之间商量,改代码,改好代码之后,添加到“本地库”
            git add Hello.java
        
        解决冲突:commit
            git commit -m "resolve confict"
        
    第六:zhangsan解决了冲突之后,使用push推送代码到远程库。
        git push https://github.com/bjpowernodegit/oa.git master
            
25. 远程库地址太长,起别名:
    
    git remote add 别名 远程库地址
------------------------------------------------------------------------------------------------------------------------------------

git 的命令总结

    git init            ->        初始化本地仓库
    git help 命令名称    ->        查看命令的帮助
    git help init        ->        查看init命令的帮助

    git config user.name zhangsan 
    设置项目签名作者为zhangsan

    git config user.email zhangsan@123.com
    设置项目签名邮箱为zhangsan@123.com

    项目签名保存在 ./.git/config 文件中

    git config --global user.name zhangsan_global
    设置仓库签名作者为zhangsan_global

    git config --global user.email zhangsan_global@.123.com
    设置仓库签名邮箱为zhangsan_global@123.com

    仓库签名保存在 ~/.gitconfig 文件中

    签名优先级使用就近原则

    git config user.name    ->        查看项目签名作者
    git config user.email    ->        查看项目签名邮箱

    git config --global user.name        ->        查看仓库签名作者
    git config --global user.email        ->        查看仓库签名邮箱

------------------------------------------------------------------------------------------------------------------------------------

    git status        ->        查看仓库的状态

    git add A文件    ->        将A文件添加到暂存区

    git rm --cached A文件    ->        将暂存区的A文件删除

    git commit A文件    ->        将暂存区的A文件提交到本地库
        commit提交时会进入vim编辑器,需要填写该版本的注释
        注释填写完成,保存退出vim

    git restore        ->        默认回到上一个版本

    git commit -m "注释填写在这" A文件        ->        将暂存区的A文件提交到本地库的同时填写注释

-------------------------------------------------------------------------------------------------------

    git log        ->        查看真实的变化记录。
        
    git log --pretty=oneline    ->        查看真实的变化记录,格式化一行。

    git log --oneline    ->        查看真实的变化记录,格式化一行,但是会取版本号的前几位。

    git reflog        ->        查看操作记录。

-------------------------------------------------------------------------------------------------------

    HEAD@{回到某个版本的步数}    ->        显示的是操作记录

    git reset --hard[部分索引值]    ->        基于索引的方式进行版本的前进和后退

    ^ 方式控制版本后退(只支持后退),一个 ^ 表示后退一个版本
    git reset --hard HEAD^        ->        后退一个版本
    git reset --hard HEAD^^        ->        后退两个版本
    git reset --hard HEAD^^^    ->        后退三个版本

    ~ 方式控制版本后退(只支持后退)
    git reset --hard HEAD~3        ->        后退3个版本
    git reset --hard HEAD~n        ->        后退n个版本

    reset三个参数对比,使用 git help reset 查看reset帮助
    --soft
        只修改本地库,修改后会导致暂存区有未提交的内容
    --mixed
        修改本地库+暂存区,修改后会导致工作区有未添加到git管理的内容
    --hard
        修改本地库+暂存区+工作区
    
    使用了 --soft 和 --mixed 之后,本地库、暂存区、工作区是不一致的,怎么恢复一致?
    答: git reset --hard HEAD (这样做工作区和暂存区都会以本地库为标准进行一致化)
    
-------------------------------------------------------------------------------------------------------

删除的文件怎么找回?
    1.添加到本地库中的文件被删除,并且删除操作已提交到本地库?
    git reset --hard[索引号]

    2.添加到本地库中的文件被删除,但删除操作未提交到本地库?
    git reset --hard HEAD

-------------------------------------------------------------------------------------------------------

文件比较(diff命令)
    1.工作区中的文件和暂存区中的文件进行比较
    git diff [文件名]

    2.工作区中的文件和本地库中的某个版本的比较
    git diff [本地库文件版本索引值] 文件名

    3.比较所有改变的文件(比较的工作区和暂存区文件的区别)
    git diff

-------------------------------------------------------------------------------------------------------

分支
    分支的好处:
    1.一个分支一般都是一个功能模块,这样多个分支就可以多个人同时并行开发,提高开发效率
    2.开发中某个分支开发偏离业务主线,失败的话,删除分支,重新开始即可。不会对主干造成污染

    分支的操作:
    1.查看现在都有哪些分支
        git branch -v
    
    2.创建新分支
        git branch 分支名称
        git branch feature_activity (市场活动模块分支)
        git branch hot_fix (热修复分支)
        (绿色分支名称表示当前所在的分支)

    3.切换分支
        git checkout 分支名称
        git checkout feature_activity 
    
    4.合并分支
        (1)假如有A和B两个分支,假设当前在A分支上,A分支做了修改之后,
             如果A分支要合并到B分支中,首先必须先切换到B分支,在B分支上执行merge命令。
        (2)在 hot_fix 分支上进行修改
             将 hot_fix 分支合并到 master 的步骤:
             第一步:切换到 master 分支上
             第二步:执行 merge 命令进行合并 git merge hot_fix

        (3)合并分支时的冲突如何解决
             1.什么时候会产生冲突?
                A分支修改了 filel ,并且将 filel 放到本地仓库。
                B分支修改了同一个文件 filel ,并且将 filel 放到本地仓库。
                A和B两个分支进行合并的时候产生冲突。
                这是因为两个人修改了同一个文件,冲突产生之后,git就无法为我们自动合并分支了,只能交给我们自己处理。

             2.冲突怎么解决?
                 第一步:和冲突人协商之后,手动修改冲突文件保存退出。
                第二步:git add [文件名]
                第三步:git commit -m "resolve conflict" (注意提交的时候不要加文件名)

-------------------------------------------------------------------------------------------------------    

注册github
    第一步:需要一个可以收取邮件的邮箱地址。(建议使用阿里云邮箱)

    第二步:打开git官网首页    https://github.com/
            在github首页填写邮箱地址。
    
    第三步:点击 Sibn up for GitHub ,弹出页面,点击 Continue 继续。

    第四步:填写密码,点击 Continue 

    第五步:输入一个名字,点击 Contine

    第六步:是否愿意接收产品更新等email,这里随意,我选择y

    第七步:验证是否为真人,点击验证

    第八步:点击 Create account 来完成账户创建。这个时候邮箱会收到一个验证码,填写验证码。

    第九步:一直继续,最终显示注册完成页面。

-------------------------------------------------------------------------------------------------------    

团队协同开发过程
    团队协同开发步骤

    第一步:创建本地库
    1.新建一个本地库,和之前练习的库分开
        使用 cd 命令跳出之前练习的本地库。
    2.项目名 oa ,使用 mkdir 新建一个目录 oa ,并使用cd命令切换到 oa 目录下
        mkdir oa
        cd oa
    3.初始化本地库 oa
        git init
    4.新建一个文件,编写内容,并将该文件上传到本地库
        vim UserService.java
        编写内容
        git add UserService.java
        get commit -m "defined interface UserService" UserService.java
    
    第二步:创建远程库
    1.使用注册的github账号登录github。
    2.点击右上角+ (New repositoy),新建仓库。
    3.填写仓库名称,设置公开 public ,创建仓库。

    第三步:从github上获取远程库地址
    1.复制地址,在本地文件中保存一份地址。
      http://github.com/dujubinaliyun/oa.git

    第四步:远程库地址太长,起个别名
    1.远程库地址太长的话,每一次 push 和 pull 的时候不方便,可以起个别名。
        git remote add remoteoa http://github.com/dujubinaliyun/oa.git
        git remote -v
    
    第五步:将本地库 push 到远程库
    1.生成访问远程仓库的 token 。并将 token 保存起来。方便以后进行身份验证。
    2. git push 远程库名字 分支名字 (表示将哪个分支推送到远程库)
    3. git push remotooa master ,弹出窗口。
    4.在窗口中输入 token ,然后 sign in 。查看命令窗口看看是否提交成功。
    5.成功后打开远程仓库,看看是否已经有这个项目。

    第六步:其他开发人员从远程库中克隆项目到本地
    1.开启一个新的 git bash 窗口
    2. mkdir 创建一个目录: mkdir zhangsan
    3. cd zhangsan (切换到zhangsan目录下)
    4.获取到远程仓库地址
    5.执行 clone 命令: git clone http://github.com/dujubinaliyun/oa.git
        clone 的时候都做了什么?
        第一:将远程库资源下载下来。
        第二:自动初始化本地库,生成 .git 目录。
        第三:自动给远程库起别名:名字为 origin 。
    
    第七步:其他开发人员对代码修改之后提交到本地库
    1.其他开发人员对代码进行修改。
    2.提交到本地库。

    第八步:其他开发人员将本地库 push 到远程库
    1.持有 Personal Access Token 的人员表示同一个团队的成员,同一个团队的成员才可以 push ,
      也就是说只要能拿到这个 Token ,就可以 push 。
      (注意: Personal Access Token 只适合 HTTPS 的请求,不适合 SSH 。)
    
    第九步:拉取 push
    1. push = fetch + merge
       pull拉取等于先 fetch ,再 merge 的合并操作。
       开发中,直接使用 pull 可能会有很多冲突需要解决。
       所以建议先 fetch ,再 merge ,执行两个命令。

    2.手动 fetch + merge 完成拉取
      (1)先切换到需要拉取远程资源的目录(使用 cd 命令切换)
      (2) cat 命令查看一下文件的内容,确认是否是以前的内容。(cat UserService.java)
      (3)将远程库 remoteoa 中的 master 分支抓取下来。(git fetch remoteoa master)
         重点:fetch 命令是将远程库 remoteoa 的 master 分支中的代码放到本地库了。
                这个分支没有合并到当前的 master 分支上。这个分支名字是: remoteoa/master 
      (4) cat 命令查看一下文件的内容,确认更改了吗?正常来说是没有更改。(cat UserService.java)
      (5)查看 fetch 下来的内容(先切换到 remoteoa/master 分支上,注意:这个分支已经在本地库了),切换分支来查看 remoteoa/master 分支上的内容
         git checkout remoteoa/master
         cat UserService.java
      (6)分支再切回当前开发者分支
           git checkout master
      (7)合并分支,将 remoyeoa/master 分支合并到当前开发者的master分支上
           git merge remoteoa/master
         pull 直接完成拉取
         git pull remoteoa master (remoteoa 是远程库地址别名,master是远程库的分支)

    第十步:张三和李四的代码都是从远程仓库中下载的最新代码。
            张三和李四同时修改了同一个文件,假设张三先 push 到远程仓库,李四再 push 到远程仓库的时候就会出现冲突现象。

            演示冲突现象
            两个开发者的本地仓库都是从远程仓库中 pull 的,版本一致。
            开发者 zhangsan 修改文件,并且提交到本地,然后 push 到远程库。
            另一个开发者也修改同一个文件,并且提交到本地库,然后尝试push到远程库。

            解决冲突(先 pull ,修改代码之后,再 push)

-------------------------------------------------------------------------------------------------------

在 IDEA 中使用 git 进行协同开发
    1.设置忽略哪些文件不提交
        在实际开发中需要提交到仓库的内容主要是 java 源代码以及 pom.xml 文件,其他文件可以忽略,
        尤其开发工具自身的一些环境文件,如果环境文件提交到仓库,其他开发人员使用不同的开发工具的话,就会有兼容问题。
        怎么忽略提交的文件,需要按照以下步骤完成:

        第一步:新建一个文件,该文件名的扩展名必须是“.ignore”,名字无所谓,主要是扩展名必须是“ignore”,
        例如:git.ignore (这个文件的位置无所谓,建议 C:\Users\Administrator\git.ignore)

        第二步:在 git.ignore 中文件中添加以下内容,在该文件中出现的内容都是不被提交的文件
            *.class
            *.log
            *.ctxt
            .mtj.tmp/
            *.jar
            *.war
            *.nar
            *.ear
            *.zip
            *.tar.gz
            *.rar
            hs_err_pid*
            .classpath
            .project
            .settings
            target
            .idea
            *.iml

        第三步:在.gitconfig 文件中添加以下配置,让 git 关联上之前配置的git.ignore 文件。
        这个.gitconfig 文件路径是:C:\Users\Administrator\.gitconfig
        
            [core]
                    excludesfile = C:/Users/Administrator/git.ignore

            注意:以上路径中斜杠采用正斜杠 /


    2.IDEA 集成 git
        (1)新建一个 Empty Project,这里起名 git,然后在空工程中创建一个 module,这里起名:git-test
        (2)提供一个 package:com.bjpowernode.git,提供一个类 GitTest
        (3) IDEA 集成 git
        (4)创建本地库,一般以工程的根作为本地库的根
           以项目的根创建本地库之后,未纳入 git 管理的,都是红色
        (5)将文件添加到暂存区
           操作:类右键 -> Git -> +Add
         添加之后颜色编程了绿色,绿色代表已经添加到暂存区,但是还没有提交到本地库
           也可以在整个项目上点击右键,添加到暂存区

           注:已忽略的文件不添加暂存区,点击 cancel 取消。
        (6)提交到本地库
           可能会有警告,确认警告没问题之后直接 commit 提交
           提交后文件颜色恢复正常


    3.切换版本
        (1)在当前程序中添加 main 方法。然后 commit
           双击上图中的文件名,会弹出下图,下图中描述了工作区和本地库中版本的区别:
        (2)在当前程序的 main 方法中添加输出语句。然后 commit提交时按照之前的步骤操作即可。
        (3)在当前程序的 main 方法中添加输出语句。然后 commit提交时按照之前的步骤操作即可。
        (4)在 IDEA 左下角可以查看所有的版本,如下图:
        
        注:黄色的图标代表当前在哪个分支上。
        在对应切换的版本上点击右键:Checkout Revision '版本号'完成版本切换,如下图:
            代码就回到了对应的版本:


    4.创建分支和切换分支
        (1)创建分支第一个方式:项目上点击右键
         弹出下图窗口,点击“+New创建分支

        (2)第二个方式:IDEABranch”来完成分支的创建。
           工具右下角找下图图标,并点击
           注意:上图中红色框之内显示的就是当前所在分支
           点击后,弹出下图:


           点击“New Branch”之后,弹出下图,填写分支名称:
           创建分支后,右下角可以查看当前所在分支,分支已经自动切换到新建的分支上。

        (3)切换分支
         注意:通过 IDEA 右下角的点击也可以切换分支。

        (4)正常合并分支
           在 hot_fix 分支上修改,然后 commit
           切换到 master 分支上,进行如下操作


           上图表示将 hot_fix 分支合并到当前分支。而当前分支时 master 分支。

        (5)分支合并发生冲突
           master 分支修改代码,然后 commit
           hot_fix 分支修改代码,然后 commit
           然后将 hot_fix 分支合并到 master 分支,会发生冲突提示


    5.IDEA 关联 github 账户
        第一步:确定一下 IDEA 是否有 github 插件。没有的话再 plugin 中安装一下。
        第二步:添加 github 账号。
               使用 Token 认证,Token 可以重新生成,但是生成的时候一定要勾选所有权限。


    6.分享项目到 github 上


    7.push 到远程库
        
        
    8.从远程库 pull 到本地库
        第一步:将远程库中代码修改一下。并提交。
        第二步:在 IDEA 中 pull 进行拉取。


    9.从 github 上 clone 项目到本地库
        将之前的本地项目删除,删除后重新打开 IDEA
        填写好 URL ,然后点击 clone 
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值