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 --global user.email 'XXXXXX@outlook.com'
- 查看设置
- 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 克隆操作
- 目的
- 将远程仓库(GitHub对应的项目)复制到本地
- 代码
- git clone https://github.com/jefxff/my-study.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 <branch-name> origin/<branch-name>。
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
Github协同开发
创建程序
- 用户A创建程序,提交到GitHub
- 用户B克隆项目
- 用户C克隆项目
开发功能
- 用户A开发功能1
- 用户B开发功能2
- 用户C开发功能3
提交
- 用户A提交功能1,并push(A用户手速快,先提交。)
- 用户B提交功能2,无法push,因为GitHub上已经有其他人提交的新代码。[解决方法]:从GitHub上获取最新代码并合并到本地,提交自己开发的功能2。
- 用户C提交功能3,无法push,无法提交,因为GitHub上已经有其他人提交的新代码。[解决方法]:从GitHub上获取最新代码并合并到本地,提交自己开发的功能3。
获取最新代码
- 用户A获取最新代码
- 用户B获取最新代码
- 用户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 <name>就可以打一个新标签
查看标签
- git tag # 如果有多个标签,默认的标签的排序是按照字母顺序排列的
查看标签信息
- git show <tagname>
为提交过的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 <tagname>
推送标签到远程仓库
- git push origin <tagname>
推送全部未推送标签
- git push origin --tags
删除已推送到远程的标签
- git push origin :refs/tags/<tagname>