Git的学习总结

☆樱花仙子☆ 提交于 2020-01-12 05:40:11

Git操作学习指南

Git与Github的连接

  1. 在github上新建一个仓库,不妨设为program.

  2. 创建SSH Key.
    在用户主目录(C:\Users\Administrator)下,看看有没有.ssh文件,如果有,再看文件下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接到下一步。如果没有,打开Git Bash,输入命令,创建SSH Key

ssh-keygen -t rsa -C "304761231@qq.com"  //qq邮箱是你自己注册GitHub的邮箱

再去用户主目录里找到.ssh文件夹,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露,id_rsa.pub是公钥,可以公开。

  1. 接下来到GitHub上,打开“Account settings”–“SSH Keys”页面,然后点击“Add SSH Key”,填上Title(随意写),在Key文本框里粘贴 id_rsa.pub文件里的全部内容。

  2. 验证是否成功,在git bash里输入下面的命令

ssh -T git@github.com
  1. 下面开始设置username和email,因为github每次commit都会记录他们.
git config --global user.name  "zhouxinxin121"//你的GitHub登陆名
git config --global user.email "304761231@qq.com"//你的GitHub注册邮箱
  1. 接下来就是把本地仓库传到github上去,之前在GitHub上建好一个新的仓库是program。
git clone git@github.com:zhouxinxin121/program.git  //克隆仓库
git add .   //添加文件
git commit -m 'finished'  //提交标签
git push origin master  //远程推送

参考资料:https://www.cnblogs.com/flora5/p/7152556.html

Git基本操作

GitHub创建仓库提示代码

	echo "# 项目名" >> README.md
	git init
	git add README.md
	git commit -m "first commit"
	git remote add origin git@github.com:qiubaiying/项目名.git
	git push -u origin master

若仓库存在直接push

	git remote add origin git@github.com:qiubaiying/test.git
	git push -u origin master

创建仓库(初始化)

	在当前指定目录下创建
	git init
	
	新建一个仓库目录
	git init [project-name]
	
	克隆一个远程项目
	git clone [url]

添加文件到缓存区

	添加所有变化的文件
 	git add .

	添加名称指定文件
	git add text.txt

配置

	设置提交代码时的用户信息
	git config [--global] user.name "[name]"
	git config [--global] user.email "[email address]"

提交

	提交暂存区到仓库区
	git commit -m "msg"
	
	# 提交暂存区的指定文件到仓库区
	$ git commit [file1] [file2] ... -m [message]
	
	# 提交工作区自上次commit之后的变化,直接到仓库区
	$ git commit -a
	
	# 提交时显示所有diff信息
	$ git commit -v
	
	# 使用一次新的commit,替代上一次提交
	# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
	$ git commit --amend -m [message]
	
	# 重做上一次commit,并包括指定文件的新变化
	$ git commit --amend [file1] [file2] ...

远程同步

	# 下载远程仓库的所有变动
	$ git fetch [remote]
	
	# 显示所有远程仓库
	$ git remote -v
	
	# 显示某个远程仓库的信息
	$ git remote show [remote]
	
	# 增加一个新的远程仓库,并命名
	$ git remote add [shortname] [url]
	
	# 取回远程仓库的变化,并与本地分支合并
	$ git pull [remote] [branch]
	
	# 上传本地指定分支到远程仓库
	$ git push [remote] [branch]
	
	# 强行推送当前分支到远程仓库,即使有冲突
	$ git push [remote] --force
	
	# 推送所有分支到远程仓库
	$ git push [remote] --all

分支

	# 列出所有本地分支
	$ git branch
	
	# 列出所有远程分支
	$ git branch -r
	
	# 列出所有本地分支和远程分支
	$ git branch -a
	
	# 新建一个分支,但依然停留在当前分支
	$ git branch [branch-name]
	
	# 新建一个分支,并切换到该分支
	$ git checkout -b [branch]
	
	# 新建一个分支,指向指定commit
	$ git branch [branch] [commit]
	
	# 新建一个分支,与指定的远程分支建立追踪关系
	$ git branch --track [branch] [remote-branch]
	
	# 切换到指定分支,并更新工作区
	$ git checkout [branch-name]
	
	# 切换到上一个分支
	$ git checkout -
	
	# 建立追踪关系,在现有分支与指定的远程分支之间
	$ git branch --set-upstream [branch] [remote-branch]
	
	# 合并指定分支到当前分支
	$ git merge [branch]
	
	# 选择一个commit,合并进当前分支
	$ git cherry-pick [commit]
	
	# 删除分支
	$ git branch -d [branch-name]
	
	# 删除远程分支
	$ git push origin --delete [branch-name]
	$ git branch -dr [remote/branch]

标签Tags

	添加标签 在当前commit
	git tag -a v1.0 -m 'xxx' 
	
	添加标签 在指定commit
	git tag v1.0 [commit]
	
	查看
	git tag
	
	删除
	git tag -d V1.0
	
	删除远程tag
	git push origin :refs/tags/[tagName]
	
	推送
	git push origin --tags
	
	拉取
	git fetch origin tag V1.0
	
	新建一个分支,指向某个tag
	git checkout -b [branch] [tag]

查看信息

	# 显示有变更的文件
	$ git status
	
	# 显示当前分支的版本历史
	$ git log
	
	# 显示commit历史,以及每次commit发生变更的文件
	$ git log --stat
	
	# 搜索提交历史,根据关键词
	$ git log -S [keyword]
	
	# 显示某个commit之后的所有变动,每个commit占据一行
	$ git log [tag] HEAD --pretty=format:%s
	
	# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
	$ git log [tag] HEAD --grep feature
	
	# 显示某个文件的版本历史,包括文件改名
	$ git log --follow [file]
	$ git whatchanged [file]
	
	# 显示指定文件相关的每一次diff
	$ git log -p [file]
	
	# 显示过去5次提交
	$ git log -5 --pretty --oneline
	
	# 显示所有提交过的用户,按提交次数排序
	$ git shortlog -sn
	
	# 显示指定文件是什么人在什么时间修改过
	$ git blame [file]
	
	# 显示暂存区和工作区的差异
	$ git diff
	
	# 显示暂存区和上一个commit的差异
	$ git diff --cached [file]
	
	# 显示工作区与当前分支最新commit之间的差异
	$ git diff HEAD
	
	# 显示两次提交之间的差异
	$ git diff [first-branch]...[second-branch]
	
	# 显示今天你写了多少行代码
	$ git diff --shortstat "@{0 day ago}"
	
	# 显示某次提交的元数据和内容变化
	$ git show [commit]
	
	# 显示某次提交发生变化的文件
	$ git show --name-only [commit]
	
	# 显示某次提交时,某个文件的内容
	$ git show [commit]:[filename]
	
	# 显示当前分支的最近几次提交
	$ git reflog

撤销

	# 恢复暂存区的指定文件到工作区
	$ git checkout [file]
	
	# 恢复某个commit的指定文件到暂存区和工作区
	$ git checkout [commit] [file]
	
	# 恢复暂存区的所有文件到工作区
	$ git checkout .
	
	# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
	$ git reset [file]
	
	# 重置暂存区与工作区,与上一次commit保持一致
	$ git reset --hard
	
	# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
	$ git reset [commit]
	
	# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
	$ git reset --hard [commit]
	
	# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
	$ git reset --keep [commit]
	
	# 新建一个commit,用来撤销指定commit
	# 后者的所有变化都将被前者抵消,并且应用到当前分支
	$ git revert [commit]
	
	# 暂时将未提交的变化移除,稍后再移入
	$ git stash
	$ git stash pop

其他

# 生成一个可供发布的压缩包
$ git archives

利用git书写博客

远程仓库更新到本地

 git pull origin master:master 

提交修改的文件

 git add . 

提交修改的信息

 git commit -m "添加了git书写博客的内容" 
本地库同步到远程库
 git push 

git使用技巧

千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM即可:

几个简单的概念
  1. repository
    通常用来组建一个简单的项目,包括文件,文件夹,图像,视频,电子图表,数据集,为你这个项目所包括的所有内容。建议包括readme文件,里面包括你这个项目包含什么以及想要干什么。hello_world 仓库可用来储存你的想法,资源或者你想和别人分享的东西。
  2. branch
    它是一种可以同时在不同版本的仓库中工作的一种方式。repository默认branch为master,合作写代码的一个方式。具体实现方法为对源代码做个复制,一起工作,然后更新,协同办公。
  3. commit
    对源文件副本进行修改并提交修改。在这里术语commit意味着保存更改。更改历史会有显示,并且有更改信息说明。
  4. pull request
    该术语为在Github上合作写代码的核心,建议你的改变,请求别人的校对回顾,把你的贡献加进他们的branch,感觉这个是用来交流反馈的,在线交流功能。
git add .
git commit -m 'memo'
git push -u origin master

关于git的一些知识

集中式VS分布式

集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。

那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。

常用语法

git add . //把文件添加到仓库
git commit -m 'wrote a new readme file'  //修改了哪里
git push -u origin master   //远程推送到github,后面可去掉-u.

基本语法

git init  //初始化一个仓库
git status  //时刻掌握仓库当前的状态
git diff    //查看修改了什么,查看difference,显示的格式正是Unix通用的diff格式
git log   //显示从最近到最远的提交日志,嫌信息太多可以加上--pretty=oneline参数。
git reflog  //Git提供了一个命令git reflog用来记录你的每一次命令
git checkout -- file //可以丢弃工作区的修改,让这个文件回到最近一次git commit或git add时的状态。
回退到上一个版本
git reset --hard HEAD^ 
git reset --hard 1094a //commit id

其中用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

基本概况

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

每次修改,如果不用git add到暂存区,那就不会加入到commit中。

从版本库中删除该文件

小提示:先手动删除文件,然后使用git rm < file >和git add< file >效果是一样的。

git rm test.txt

命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

添加本地库

目前,在GitHub上新建的仓库learngit还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。

git remote add origin git@github.com:zhouxinxin121/learngit.git 

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

git push -u origin master

这就可以把本地库的所有内容推送到远程库上,把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!

克隆远程库
git clone git@github.com:zhouxinxin121/gitskills.git

实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

创建与合并分支

应用场景是什么?Git分支十分强大,在团队开发中应该充分应用。

git checkout -b dev  //创建dev分支,然后切换到dev分支:git branch dev,git checkout dev
git branch  //查看当前分支
git merge dev  //把dev分支的工作成果合并到master分支上
git branch -d dev  //删除分支
git log --graph  //看到分支合并图

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除.

开发一个新feature,最好新建一个分支.

多人协作

git remote    //查看远程库的信息
git remote -v   //显示更详细的信息
git push origin master //推送分支,就是把该分支上的所有本地提交推送到远程库。

master分支是主分支,因此要时刻与远程同步,master是开发分支,团队所有成员都需要在上面工作.

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

  1. 首先,可以试图用git push origin < branch-name >推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

标签管理

git tag v1.0  //打一个新标签
git tag        //查看所有标签
git tag v0.9 f52c633 //默认标签是打在最新提交的commit上的。
git tag -d v0.1  //标签打错了,也可以删除
git push origin v1.0 //推送某个标签到远程
git push origin --tags //一次性推送全部尚未推送到远程的本地标签
git push origin :refs/tags/<tagname> //可以删除一个远程标签。

因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

自定义Git

git config --global color.ui true  //让Git显示颜色,会让命令输出看起来更醒目

忽略某些文件时,需要编写.gitignore.

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

参考文献

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