Fork me on GitHub

Git| GitHub常用的操作

 

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

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

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

 版本管理系统:

                                       

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

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

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

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

                                         

1、命令行工具:Git for windows

https://git-scm.com/book/zh/v2

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 bug

3)合并分支 先切换到主干,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下来:

或者

 

 
posted @ 2019-05-12 01:13  kris12  阅读(493)  评论(0编辑  收藏  举报
levels of contents