Git& GitHub常用的操作

☆樱花仙子☆ 提交于 2020-03-25 12:41:51

 

 Git是目前世界上最先进的分布式版本控制系统。

创始人:Linus Torvalds林纳斯·托瓦兹 

经典的集中管理型(CVS、VSS、SVN)

 版本管理系统:

                                       

1、版本管理的服务器一旦崩溃,硬盘损坏,代码如何恢复?

2、程序员上传到服务器的代码要求是完整版本,但是程序员开发过程中想做小版本的管理,以便追溯查询,怎么破?

3、系统正在上线运行,时不时还要修改bug,要增加好几个功能要几个月,如何管理几个版本?

4、如何管理一个分布在世界各地、互不相识的大型开发团队?

                                         

1、命令行工具:Git for windows

Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。

  C:\Users\admin路径下的.gitconfig文件里面可以看到

  --global 表示全局属性,所有的git项目都会共用属性

1)填写用户名和邮箱Administrator@PC201803221826 MINGW64 /e/git-space
$ git config --global user.name "kris"
Administrator@PC201803221826 MINGW64 /e/git-space
$ git config --global user.email "kris073@aliyun.com" ##全局是每个项目都是这个名;  非全局是针对这个项目,优先使用本地再全局;
2)创建版本库
Administrator@PC201803221826 MINGW64 /e/git-space
$ git init  //在项目文件夹内执行;
Initialized empty Git repository in E:/git-space/.git/
3)提交文件
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git status  //查看文件状态;
On branch master
Initial commit
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        src/  ##被追踪状态,红色;
nothing added to commit but untracked files present (use "git add" to track)

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git add src/abc.java  ①##加入暂存区
warning: LF will be replaced by CRLF in src/abc.java.
The file will have its original line endings in your working directory.
$ git commit #②把暂存区的提交到本地库;命名为:即直接带注释提交:git commit -m "create01"
$ vim src/abc.java 把文件修改后,它的状态还是红色
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
        modified:   src/abc.java
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        src/main/
        src/pom.xml

no changes added to commit (use "git add" and/or "git commit -a")
$ git add src/pom.xml
$ git add src/abc.java
$ git commit -m "create 02"4)查看文件提交记录 git log 文件名
$ git log --pretty=oneline
7595ce37bf951f64fc838feb78eed3ddc2da24b1 update 04
add4b426ac0306b408e1c6b6c1e09f3188387a9e create 03
ce667fbd41f4f51b2810a816e238afcaddec8be1 create 02
0b2ee35565d8eb7943100ca5db507e99a3e6d2e4 create 01

5)回退历史:
git  reset  --hard HEAD^   回退到上一次提交
git  reset  --hard HEAD~n  回退n次操作
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git reset --hard HEAD^
HEAD is now at add4b42 create 03
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git log --pretty=oneline
add4b426ac0306b408e1c6b6c1e09f3188387a9e create 03
ce667fbd41f4f51b2810a816e238afcaddec8be1 create 02
0b2ee35565d8eb7943100ca5db507e99a3e6d2e4 create 01
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git reset --hard HEAD~2
HEAD is now at ce667fb create 02


6) 版本穿越:
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git reflog  ##查看历史记录的版本号,
add4b42 HEAD@{0}: reset: moving to HEAD^
7595ce3 HEAD@{1}: commit: update 04
add4b42 HEAD@{2}: commit: create 03
ce667fb HEAD@{3}: commit: create 02
0b2ee35 HEAD@{4}: commit (initial): create 01

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git reset --hard 7595ce3  ##回到这个版本号的状态;
HEAD is now at 7595ce3 update 04


7) 还原文件:
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ vim src/pom.xml  ##改错了,想回到之前的状态;只还原一个文件
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git checkout -- src/pom.xml
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ vim src/pom.xml

8) 删除某个文件
 先删除文件 #把本地文件删了,但它服务器上还有
再git add 再提交
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    src/pom.xml ##红色,删除了也是有变化

no changes added to commit (use "git add" and/or "git commit -a")
$ git add src/pom.xml

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git commit
Aborting commit due to empty commit message.

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git commit -m "fix bug"
[master 00e4cff] fix bug
 1 file changed, 1 deletion(-)
 delete mode 100644 src/pom.xml

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git log --pretty=oneline
00e4cff3cbc3d722bcd997caf25edb424286b687 fix bug  ##版本记录就是为了留痕;完全删除了删不了的;
ce667fbd41f4f51b2810a816e238afcaddec8be1 create 02
0b2ee35565d8eb7943100ca5db507e99a3e6d2e4 create 01

工作区  + 暂缓区 + 本地库

  工作区(Working Directory):就是你电脑本地硬盘目录

  本地库(Repository):工作区有个隐藏目录.git,它就是Git的本地版本库

  暂存区(stage):一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

          

 

2.  Git的实战操练---分支

分支:
系统上线了,但是产品经理又提了新的需求,评估一下工期要两个月,但是同时系统正在上线运行,时不时还要修改bug,如何管理几个版本?
 两段代码的功能上线时间是不同的,就用到分支了,拆开;分支之间互相独立不影响;
1)创建分支 git branch 分支名 master分支:
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git branch -v //查看分支
* master 00e4cff fix bug
 创建名为dev的分支
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git branch dev

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git branch -v
  dev    00e4cff fix bug
* master 00e4cff fix bug
2)切换分支 git checkout 分支名  //只是切换; git checkout -b 分支名  //创建并且切换
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git checkout dev
Switched to branch 'dev'

Administrator@PC201803221826 MINGW64 /e/git-space (dev)
$ vim newfunc.java
Administrator@PC201803221826 MINGW64 /e/git-space (dev)
$ git add newfunc.java
  warning: LF will be replaced by CRLF in newfunc.java.
  The file will have its original line endings in your working directory.
Administrator@PC201803221826 MINGW64 /e/git-space (dev)
$ git commit -m "newfunc"
  [dev 0830a63] newfunc
  warning: LF will be replaced by CRLF in newfunc.java.
  The file will have its original line endings in your working directory.
   1 file changed, 1 insertion(+)
   create mode 100644 newfunc.java

Administrator@PC201803221826 MINGW64 /e/git-space (dev)
$ git branch -v
* dev    0830a63 newfunc  ##在这个分支上创建并提交,就往前推动了一步;
  master 00e4cff fix bug3)合并分支 先切换到主干,git checkout master //再合并git merge 分支名
Administrator@PC201803221826 MINGW64 /e/git-space (dev)
$ git checkout master
  Switched to branch 'master'
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git checkout dev  ##这样子来回切一遍,newfunc.java就出来了;虽然在分支上,但最终还是要回到主干上;切换到分支它才会出现;切到master就不见了;
Switched to branch 'dev'
把分支合并,拽取/吸收,站在没有功能的那个分支
$ git branch -v
  dev    0830a63 newfunc
* master 00e4cff fix bug

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git merge dev 
Updating 00e4cff..0830a63
Fast-forward
 newfunc.java | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 newfunc.java
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git branch -v
  dev    0830a63 newfunc
* master 0830a63 newfunc

冲突:大家都改同一份代码

冲突一般指同一个文件同一位置的代码,在两种版本合并时版本管理软件无法判断到底应该保留哪个版本,因此会提示该文件发生冲突,需要程序员来手工判断解决冲突。
合并时冲突:
程序合并时发生冲突系统会提示CONFLICT关键字,命令行后缀会进入MERGING状态,表示此时是解决冲突的状态。

解决冲突:
此时通过git diff 可以找到发生冲突的文件及冲突的内容。然后修改冲突文件的内容,再次git add <file> 和git commit 提交后,后缀MERGING消失,说明冲突解决完成。

  ①合并merge时产生的冲突;

////master主分支修改newfunc.java文件$ vim newfunc.java
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git add newfunc.java
$ git commit -m "mm"
[master 4b2a4d7] mm
 1 file changed, 1 insertion(+)
$ git branch -v
  dev    0830a63 newfunc
* master 4b2a4d7 mm
////////dev分支也修改同样的文件!!!
$ git checkout dev
Switched to branch 'dev'
Administrator@PC201803221826 MINGW64 /e/git-space (dev)
$ vim newfunc.java
Administrator@PC201803221826 MINGW64 /e/git-space (dev)
$ git add newfunc.java
$ git commit -m "dd"
$ git branch -v
* dev    34671bc dd
  master 4b2a4d7 mm

Administrator@PC201803221826 MINGW64 /e/git-space (dev)
$ git checkout master
  Switched to branch 'master'
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git branch -v
  dev    34671bc dd
* master 4b2a4d7 mm

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git merge dev   ##master和分支都修改同一个文件,master在合并分支时就会出现错误:
  Auto-merging newfunc.java
  CONFLICT (content): Merge conflict in newfunc.java
  Automatic merge failed; fix conflicts and then commit the result.
  Administrator@PC201803221826 MINGW64 /e/git-space (master|MERGING)  #正在合并中
 解决:编辑文件,可以把标签删了(可以选择要哪个改动的),然后重新提交
Administrator@PC201803221826 MINGW64 /e/git-space (master|MERGING)
$ vim newfunc.java
ggggggggggg
<<<<<<< HEAD 删
mmmmmmmmmmm
=======     删
HHHHHHHHHHH
>>>>>>> dev 删
Administrator@PC201803221826 MINGW64 /e/git-space (master|MERGING)
$ git add newfunc.java
Administrator@PC201803221826 MINGW64 /e/git-space (master|MERGING)
$ git commit -m "mmdd"
[master f33fb98] mmdd

Administrator@PC201803221826 MINGW64 /e/git-space (master) ##在不同分支newfunc.java的数据内容是不一样的;
$ git branch -v                             
  dev    34671bc dd
* master f33fb98 mmdd

 

3. GitHub介绍与实操

GitHub是一个Git项目托管网站,主要提供基于Git的版本托管服务

                            

                                 

https://github.com/kris-2018/Test.git起别名是放在conf里边的
1) 增加远程地址  git remote add <远端代号> <远端地址> 。  <远端代号> 是指远程链接的代号,一般直接用origin作代号,也可以自定义。  <远端地址> 默认远程链接的url
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git remote add origin https://github.com/kris-2018/Test.git 
2)推送到远程库git push <远端代号> <本地分支名称>。  <远端代号> 是指远程链接的代号。  <分支名称>  是指要提交的分支名字,比如master。  例: git  push  origin  master
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git push origin master
Username for 'https://github.com': 2030323705@qq.com
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (24/24), 1.70 KiB | 0 bytes/s, done.
Total 24 (delta 0), reused 0 (delta 0)
To https://github.com/kris-2018/Test.git
 * [new branch]      master -> master

 3) 从GitHub上克隆一个项目
    git clone <远端地址> <新项目目录名>。
    <远端地址> 是指远程链接的地址。
    <项目目录名> 是指为克隆的项目在本地新建的目录名称,可以不填,默认是GitHub的项目名。
    命令执行完后,会自动为这个远端地址建一个名为origin的代号。
    例 git clone https://github.com/user111/Helloworld.git hello_world

Administrator@PC201803221826 MINGW64 /e/git-Hei
$ git clone https://github.com/kris-2018/Test.git Test
Cloning into 'Test'...

 4) 从GitHub更新项目
    git pull <远端代号> <远端分支名>。
     <远端代号> 是指远程链接的代号。
     <远端分支名>是指远端的分支名称,如master。
     例 git pull origin master



 

需要添加Collaborators合作者

  在项目中点击settings页签,然后点击Collaborators,然后在文本框中搜索合作伙伴的邮箱或者账号。点击添加。
    添加后GitHub会给合作伙伴对应的邮箱发一封,邀请邮件。

  合作伙伴会收到邀请邮件。点击View invitation 按钮后会跳转至GitHub页面,让合作伙伴选择,是否接受邀请。
    点击接受后,则合伙伙伴正式加入项目,获得直接提交代码的权限。

 remote: Permission to kris-2018/Test.git denied to kris073.

 

kris18用户: Collaborators:
Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
$ vim src/abc.java   ##对数据进行修改
Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
$ git add src/abc.java
Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
$ git commit -m "a"  ##提交
[master ccbf98d] a
 1 file changed, 1 insertion(+)

Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
$ git push origin master
Username for 'https://github.com': kris18@aliyun.com
Counting objects: 4, done.

  kris-2018用户再pull更新下数据

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git pull origin master
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 12 (delta 0), reused 12 (delta 0), pack-reused 0
Unpacking objects: 100% (12/12), done.
From https://github.com/kris-2018/Test
 * branch            master     -> FETCH_HEAD
   f33fb98..36cee76  master     -> origin/master
Updating f33fb98..36cee76
Fast-forward
 src/abc.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ vim src/abc.java  ##数据已经发生更新;

协作冲突

冲突:两个人之间

在上传或同步代码时,由于你和他人都改了同一文件的同一位置的代码,版本管理软件无法判断究竟以谁为准,就会报告冲突,需要程序员手工解决。

① 一种是做下权限,加到项目组;  ② 审查机制;

  在第三方中点Fork

解决冲突,三板斧:
  1、修改合并
  2、git add 
  3、git commit

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ vim src/abc.java

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git add src/abc.java

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git commit -m "ccc"
[master 824de95] ccc
 1 file changed, 1 insertion(+)

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git push origin master
Username for 'https://github.com': 2030323705@qq.com
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 318 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To https://github.com/kris-2018/Test.git
   36cee76..824de95  master -> master



##################################

$ vim src/abc.java  ##修改
Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
$ git add src/abc.java

Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
$ git commit -m "dd"
[master 10b7713] dd
 1 file changed, 1 insertion(+)

Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
$ git push origin master
Username for 'https://github.com': kris18@aliyun.com
To https://github.com/kris-2018/Test.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/kris-2018/Test.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.
$ git pull origin master  ##两个人修改不同地方有可能不会报错,修改同一个地方肯定会报错的
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/kris-2018/Test
 * branch            master     -> FETCH_HEAD
   36cee76..824de95  master     -> origin/master
Auto-merging src/abc.java
CONFLICT (content): Merge conflict in src/abc.java
Automatic merge failed; fix conflicts and then commit the result.

解决办法:
$ vim src/abc.java
aaaaaaaaaaa
bbbbbbbbbb
<<<<<<< HEAD
dddddddddddddddd
=======
ccccccccccccccccc
>>>>>>> 824de9578a98395bb4623035ddaa0231322c5d6a
Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master|MERGING)
$ vim src/abc.java
Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master|MERGING)
$ git add src/abc.java

Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master|MERGING)
$ git commit -m "bbcc"
[master eff7cbb] bbcc

Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
$ git push origin master
Username for 'https://github.com': kris18@aliyun.com
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (8/8), 644 bytes | 0 bytes/s, done.
Total 8 (delta 0), reused 0 (delta 0)
To https://github.com/kris-2018/Test.git
   824de95..eff7cbb  master -> master

 kris-2018本地仓库再pull更新下:

Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git pull origin master
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 8 (delta 0), reused 8 (delta 0), pack-reused 0
Unpacking objects: 100% (8/8), done.
From https://github.com/kris-2018/Test
 * branch            master     -> FETCH_HEAD
   824de95..eff7cbb  master     -> origin/master
Updating 824de95..eff7cbb
Fast-forward
 src/abc.java | 1 +
 1 file changed, 1 insertion(+)

4.  在idea中使用Git

配置下Git地址:

 把idea中项目提交到GitHub

使用在远端建立仓库:

 出现弹框:填写仓库名和描述;  

选择项目中要提交的:只提交源码的,.idea是你本地工程文件不要提交,.iml随意可提交也可不提交;

  提交src下的java源码工程、pom文件;

如果弹窗出现Add File to Git:它会去检查你工程文件看看那个没提交,不能提交.dea你的工程文件,直接把它Remenber,don‘t ask again;  点击NO

  蓝色就是有改动过但还没提交;红色是还没有提交的文件; 绿色表已放在了暂缓区;

红色:

把刚刚放在暂缓区的文件提交了: 先提交到本地( 下面截图即是提交到本地 );   再push

 

把别人的代码down下来:

或者

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!