git 学习

jefxff 153,605 2020-01-31

Git 安装和使用

目的

通过Git管理Github托管项目代码

下载安装
  • Linux上安装Git,使用命令 sudo apt-get install git
  • windows上安装Git,从Git官网下载安装
  • 安装完成后在桌面单击右键看是否安装成功(在桌面单机右键,看是否会出现[git bush here];如果出现,说明git安装成功)
Git工作区域
  • 工作区(Working Directory)
    • 添加、编辑、修改文件等动作
  • 暂存区
    • 暂存已经修改的文件最后统一提交到git仓库中
  • Git Repository(Git 仓库)
    • 最终确定的文件保存到仓库,成为一个新的版本,并且对他人可见
Git 初始化及仓库的建立和操作
初始化一个新的 Git 仓库
  • 创建文件夹 $:mkdir (file name) --->例如:my-study
  • 在文件内初始化 Git (创建 Git 仓库)
    • cd my-study
    • git init (这条命令生成一个隐藏的 .git 文件夹,用来存储仓库所有信息, 这条命令会将)
基本信息设置
  • 设置用户名
    • git config --global user.name 'XXXXXX'
  • 设置用户邮箱
  • 查看设置
    • git config --list
向仓库中添加文件
  • 用 $:touch 或者 vim 命令创建文件(需要添加的程序代码文件、或者.txt文件,等等)
  • 用 $:git add (files name) 将文件(files name)从 工作区 添加到 暂存区
  • 用 $:git commit -m 'add test.py' 将文件(files name)提交到Git本地仓库
修改文件
  • 修改文件 利用 vi\vim 等编辑器修改文件
  • 用 $:git add (files name) 将文件从 工作区 添加到 暂存区
  • 用 $:git commit -m '这里是添加说明的' 将文件从暂存区提交到Git本地仓库
删除文件
  • (#这是删除文件夹中的文件) $:rm -rf test.py 通过Linux强制删除命令,直接删除文件)
  • 删除文件
    • $:rm test.py
  • 从Git中删除文件
    • $:git rm test.py
  • 提交操作
    • $:git commit -m "说明本次删除原因"
Git 管理远程仓库
使用远程仓库的目的
  • 作用:备份,实现多人的代码共享集中化管理
将本地代码提交到远程仓库
  • (首先clone Github 的远程仓库到本地,然后在本地的仓库进行6.3的操作,再通过 git push 将文件提交到 Github 上。)
  • 用 $:touch 或者 vim 命令创建文件
  • 用 $:git add (files name) 将文件添加到暂存区
  • 用 $:git commit -m 'add test.py'
  • 用 $:git push 将本地仓库提交到远程
Git 克隆操作
解决 git push 错误
	# The requested URL returned error: 403 Forbidden while accessing
	# 答案:私有项目,没有权限,输入用户名密码,或者远程地址采用这种类型

	vi .git/config

	# 将
	[remote "origin"]
		url = https://github.com/'用户名'/'仓库名.git'
	修改为:
	[remote "origin"]
		url = https://'用户名':'密码'@github.com/'用户名'/'仓库名.git	'
Git命令
Git基本命令
  • git help --web log (网页查看历史版本文档)
  • git mv readme readme.md (将readme重命名为readme.md)
  • git --oneline --all -n4 --graph
    • 其中: --oneline (单行显示), --all(显示所有分支), -n4(显示4行), --garph(带分支的演变历史)
  • gitk (图形界面工具查看版本历史,其中颜色相同的表示同一个commit)
  • git config --local --list (查看配置信息)
版本回滚
  • 通过命令 git log 查看历史版本提交记录,用HEAD表示的是当前版本的版本
  • 根据版本commit值可以进行回滚 命令:$ git reset --hard 版本号
  • 如果往前回滚一个版本 命令:$ git reset --hard HEAD^ 注意:一个^表示的是回滚一个版本,^^表示的是回滚两个版本, 回滚一百个版本可以表示为: HEAD~100
  • 如果要再回到最新版本 命令:$ git reflog ; 或者使用命令: git reset --hard commit版本号 来回到未来的版本
忽略文件
  • 我们无需让Git跟踪的目录,在Git目录下创建 .gitignore 的特殊文件(这个文件以英文的句点打头,并没有扩展名)并在文件中添加不需要Git跟踪的文件的文件名,
    • 例如:(__pycache__文件不需要Git跟踪)就在 .gitignore 文件中添加如下内容:__pycache__/
  • 如果你使用的是Python 2.7, 请将这行内容改为*.pyc 。Python 2.7不会创建目录__pycache__,它将每个.pyc文件都存储在相应.py文件所在的目录中。其中的星号让Git忽略所有扩展名为.pyc的文件。

Git branch

分支学习

branch称之为分支,默认只有一个分支名为master的分支。一般开发新功能时会在分支dev上进行,开发完毕之后再合并到master分支。

分支命令
命令说明
$ git branch 分支名# 创建分支
$ git checkout 分支名# 切换分支
$ git checkout -b 分支名# 或者使用合并命令:(表示创建并切换到新创建的分支)
$ git merge 分支名# 在切换回到master分支上面之后执行此命令,进行合并分支
注:$ git branch -av# 此命令表示列出所有的分支,并且会在当前所在的分支前加*
$ git branch -m 分支名# 创建并切换到指定分支
$ git branch# 查看所有分支
$ git branch -d 分支名# 删除分支
$ git branch -D 分支名# 强行删除一个没有被合并过的分支

Git stash

stash 用于将工作区发生变化的所有文件获取临时存储在“某个地方”,将工作区还原当前版本未操作前的状态;stash还可以将临时存储在“某个地方”的文件再次拿回到工作区。

命令
命令说明
$ git stash# 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
$ git stash list# 查看“某个地方”存储的所有记录
$ git stash clear# 清空“某个地方”
$ git stash pop# 再将某个地方的代码拿回来继续开发, 同时将stash内容删除掉
$ git stash apply# 编号,将指定的编号记录从“某个地方”重新拿到工作区(可能有冲突), 不会删除stash的内容
$ git stash daop# 编号,删除指定编号的记录

Github

命令
  • 将开发完毕的代码推送到GitHub
	$ git remote add origin git@github.com:`github账户名`/`仓库名`.git   # 新的本地仓库第一次关联GitHub仓库
	$ git remote add origin https://github.com/jefxff/my-study.git  # 为地址起一个别名origin
	$ git remote rm origin  # 删除本地已经关联的GitHub远程仓库
	$ git remote -v  # 查看远程仓库信息
	$ git push -u origin master  # 第一次将本地master分支内容以及版本信息推送到Github
	$ git push origin master  # 将本地master分支内容以及版本信息推送到Github
	$ git push origin dev # 将本地dev分支内容以及版本信息推送到GitHub
  • 新的本地Git,需要将代码从GitHub中获取并继续开发,实现不同办公地点同步
	$ git clone git@github.com:`GitHub账户名`/`仓库名`.git   # git://使用ssh,而且不用每次输入密码
	$ git clone https://github.com/jefxff/my-study.git  # http协议速度慢,而且每次输密码  #将项目从Github中获取(默认获取的是master分支,如果需要在其他分支工作,需要创建并切换分支)
	$ git branch dev origin/dev  #创建dev分支且和远程dev分支同步
	$ git push origin dev  #提交dev分支内容到远程GitHub托管仓库的dev
  • 实际情形:在公司开发的代码提交到GitHub,需要再家里继续开发,就需要去github拉取最新的代码
	$ git checkout dev  #切换分支	
	$ git pull origin dev  #从远程Github仓库获取dev分支的最新内容,并合并到本地
	$ vim files / $ git add . / $ git commit -m "开发功能"(再家进行开发并提交)
  • 实际情形:再家更新了部分功能,在公司需要将最新功能从GitHub中拉取,并继续开发
	$ git checkout dev #切换分支
	$ git fetch origin dev 	 #从GitHub中获取dev分支最新内容到版本库的分支
	$ git merge oirgin/dev   #将版本库的分支内容合并到工作区
	$ vim files / $ git add . / $ git commit -m "开发功能"(再公司开发并提交)
  • 将Git和GitHub结合使用做到避免电脑损坏造成数据丢失以及多地开发的问题,上文执行过程中执行【git pull origin 分支】命令等同于【git fetch origin 分支】+ 【git merge origin/分支】,并且在执行过程中可能会出现冲突,原因是由于本地代码和获取的最新代码有重合部分,那么就需要自己手动解决冲突然后再继续开发。

  • 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/

  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

  • 详细查看 http://www.cnblogs.com/wupeiqi/p/7295372.html 武沛齐的博客

Github协同开发

创建程序
  1. 用户A创建程序,提交到GitHub
  2. 用户B克隆项目
  3. 用户C克隆项目
开发功能
  1. 用户A开发功能1
  2. 用户B开发功能2
  3. 用户C开发功能3
提交
  1. 用户A提交功能1,并push(A用户手速快,先提交。)
  2. 用户B提交功能2,无法push,因为GitHub上已经有其他人提交的新代码。[解决方法]:从GitHub上获取最新代码并合并到本地,提交自己开发的功能2。
  3. 用户C提交功能3,无法push,无法提交,因为GitHub上已经有其他人提交的新代码。[解决方法]:从GitHub上获取最新代码并合并到本地,提交自己开发的功能3。
获取最新代码
  1. 用户A获取最新代码
  2. 用户B获取最新代码
  3. 用户C获取最新代码
注意:

上述中括号中的解决办法可以有三种方式操作, 三者都可以完成合并并提交新功能,但是日志记录会有差异,如:前两者版本记录中会出现合并,而第三种可以保证版本记录干净整洁。

	先 git pull origin master   然后 git push origin master
	先 git fetch origin master  然后 git merge origin/master   再 git push origin master

GIT标签

标签管理

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。默认的去标签是创建在最新提交的commit上的.

创建标签
创建新标签
  • $ git checkout master # 首先切换到需要创建标签的分支
  • $ git tag v1.0 # 敲命令git tag 就可以打一个新标签
查看标签
  • git tag # 如果有多个标签,默认的标签的排序是按照字母顺序排列的
查看标签信息
  • git show
为提交过的commit创建标签
  • 使用 git log 查看commit 的id 号
  • 使用命令 $ git tag commit id 为之前提交的版本创建标签
标签的参数 -a -m
  • 参数 -a 指定标签名
  • 参数 -m 指定说明文字
  • 例如: git tag -a v0.1 -m "version 0.1 released" 1094adb
操作标签
删除标签(本地)
  • git tag -d
推送标签到远程仓库
  • git push origin
推送全部未推送标签
  • git push origin --tags
删除已推送到远程的标签
  • git push origin :refs/tags/

# linux