Git版本控制和连接GitHub
一、Git简介
1. Git概述
Git先进的分布式 版本控制 系统, GitHub是Git常用的代码托管中心
Git = GitHub
安装完成后,在任何空白位置上右击 git bash here 输入 git --version,有版本提示即成功.
git --verion
二、本地库基本操作
1. 创建本地仓库repository
- 首先,在合适的位置上 创建空白目录(仓库),
git
命令有很多跟linux
相通的 例如cd
、ls
等,内置vim
MECHREVO@□□е□□□□ MINGW64 ~/Desktop
$ mkdir MyGitRepo # 创建目录
MECHREVO@□□е□□□□ MINGW64 ~/Desktop
$ cd MyGitRepo/
MECHREVO@□□е□□□□ MINGW64 ~/Desktop/MyGitRepo
$
- 其次, 通过 初始化 仓库,使得该目录可以被Git管理
MECHREVO@□□е□□□□ MINGW64 ~/Desktop/MyGitRepo
$ git init
Initialized empty Git repository in C:/Users/Administrator/Desktop/MyGitRepo/.git/
MECHREVO@□□е□□□□ MINGW64 ~/Desktop/MyGitRepo (master)
$ ls -la # 查看当前文件目录情况
total 12
drwxr-xr-x 1 MECHREVO 197121 0 7月 22 12:54 ./
drwxr-xr-x 1 MECHREVO 197121 0 7月 22 12:49 ../
drwxr-xr-x 1 MECHREVO 197121 0 7月 22 12:54 .git/
.git是隐藏文件目录,里面存放的是跟踪管理版本库,一般不要随意修改,否则会破坏Git仓库不能用
- 设置签名, 区分 不同的开发人员身份 ,这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系. 签名分 项目(仓库)级别 适用当前本地库范围 和 系统用户级别 适用当前操作系统的用户都存在的时候,优先项目级别. 至少又一个.
# 项目级别/仓库级别
$ git config user.name jackmin
$ git config user.email xxxxxx@xxx.com
# 系统用户级别
$ git config --global user.name jackmin
$ git config --global user.email xxxx@xxx.com
- 查看git状态
MECHREVO@□□е□□□□ MINGW64 ~/Desktop/MyGitRepo (master)
$ git status On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
2. 补充版本库(Repository)知识
- 工作区有一个隐藏目录
.git
,这个不算工作区,而是Git的版本库。 - Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支
master
,以及指向master
的一个指针叫HEAD
。
- 有分支和
HEAD
的概念,我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支master。(这里的master不是github上的)
3. 管理修改
- 尝试查看当前的status
MECHREVO@□□е□□□□ MINGW64 ~/Desktop/MyGitRepo (master)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
text.txt # 红色
nothing added to commit but untracked files present (use "git add" to track)
text.txt 是红色字体,表明当前文件存在工作区,但是**需要提交到暂存区 **
- 通过提交到暂存区
git add <file>
,文件名支持正则匹配那种 (如果存在多个后缀是.txt文件,用*.txt)
$ git add *.txt # 所有以.txt结尾的文本都会被加入到暂存区
warning: LF will be replaced by CRLF in text.txt.
The file will have its original line endings in your working directory
# 再次查看git状态
$ git status On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: text.txt # 绿色
new file: text.txt 是 绿色字体 表示 已经加到了暂存区 , 需要提交到master
如果要从 暂存区撤回 , 执行git rm --cached <file>
也是可以用正则匹配的
$ git rm --cached <file>
- 执行 git commit text.txt将暂存区文件提交到master,会默认打开vim编辑窗口要求在第一行输入 commit message
$ git commit text.txt
Git_2.png
通过这种方式必须要输入,否则不予许commit;完毕再次查看当前git状态
$ git status
On branch master
nothing to commit, working tree clean
git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别
- 打开vim输入觉得麻烦,可以直接输入
git commit -m “here are commit message” <file>
直接给定commit message然后提交
$ git commit -m "This is the second time to write the message" text.txt
On branch master
nothing to commit, working tree clean
- 如果修改了text.txt文件而没有提交,则运行
git status
会提示 <font color =red>modified : text.txt</font> 红色字体,被修改.需要再次add ,commit - 查看git 日志
git log
MECHREVO@□□е□□□□ MINGW64 ~/Desktop/MyGitRepo (master)
$ git log
commit 90f022e03b9137b51d6434caf10058d161b69524 (HEAD -> master)
Author: Jack Chen <1416825008@qq.com>
Date: Mon Jul 22 15:04:12 2019 +0800
This is the second time to write the message
commit 353ed8f1bc9e0d69081612645c91532b59ffe142
Author: Jack Chen <1416825008@qq.com>
Date: Mon Jul 22 14:28:31 2019 +0800
This is the first time to write the message
4. 版本回退
可以看到有两次提交日志, 而head 指针指向了最近一次修改. 推荐使用 基于索引值的版本进退,
每次修改会有记录,如果仅仅撤销上次commit message并修改可用:
$ git commit --amend -m "commit message"
- 把改变当前工作目录中文件恢复到指定的工作状态,默认最新
$ git checkout "90f022e"
- 当使用
git checkout --hard "90f022e"
撤销了这几次commit时,又想重做这几次的commit
git reflog
和git reset
$ git reflog
$ git reset "90f022e"
git log
列出的是生效的, 没有丢弃的commit, git reflog
查找到被git checkout --hard
“抛弃”掉的那几次commit的sha值通过git reset
恢复到想要的commit上去。
- commit了几次后发现错误地commit到了master分支上了,你只是想commit到feature分支上。
git branch feature然后 git reset --hard origin/master 最后git checkout feature
- 图片来源网络
Git_3.png
慎用git rebase
会变基,会产生代码冲突(蠢人给 push了)
当Bob需要从远程pull拉取feature时候,就会出现代码冲突.
rebase就是bob->you的变化; merge还是两个分支,只不过在merge后这个点交汇
rebase 提示错误一个个解决,中途可以退出;merge则是全显示出来 -
图片来源网络
Git_4.png
git pull –rebase
的理解:
这个命令做了以下内容:
a.把你 commit 到本地仓库的内容,取出来放到暂存区(stash)(这时你的工作区是干净的)
b.然后从远端拉取代码到本地,由于工作区是干净的,所以不会有冲突
c.从暂存区把你之前提交的内容取出来,跟拉下来的代码合并 .
三、远程库基本操作
1.添加远程库
- 登陆
GitHub
,然后,在右上角找到“Create a new repo
”按钮,创建一个新的仓库 或者关联已经存在的仓库. - 进入仓库目录点击 <font color =green>
clone or download
</font> 选择 clone with https 复制链接 例如:https://github.com/JackMin1314/Learning_Skill.git - 查看当前库的远程库情况,发现没有任何远程库提示说明
$ git remote -v
- 关联远程仓库
$ git remote add origin https://github.com/JackMin1314/Learning_Skill.git
- 再次查看当前远程库情况,发现已经添加了
$ git remote -v
origin https://github.com/JackMin1314/Learning_Skill.git (fetch)
origin https://github.com/JackMin1314/Learning_Skill.git (push)
2. 克隆远程库到本地
- 用
git clone <https://...>
可以将远程库复制到本地.
$ git clone https://github.com/JackMin1314/Learning_Skill.git
MECHREVO@□□е□□□□ MINGW64 ~/Desktop/MyGitRepo ((90f022e...))
$ git clone https://github.com/JackMin1314/Learning_Skill.git
Cloning into 'Learning_Skill'...
remote: Enumerating objects: 24, done.
remote: Counting objects: 100% (24/24), done.
remote: Compressing objects: 100% (21/21), done.
remote: Total 24 (delta 1), reused 15 (delta 0), pack-reused 0
Unpacking objects: 100% (24/24), done.
# 再次查看当前目录,发现有Learning_Skill 文件夹,进入后发现github上的文件都在里面
MECHREVO@□□е□□□□ MINGW64 ~/Desktop/MyGitRepo ((90f022e...))
$ ls
Learning_Skill/ text.txt
3.创建与合并分支
- 查看当前分支和创建
git branch <branchname>
删除git branch -d <branchname>
分支
$ git branch # 查看分支和当前分支
* master
$ git branch myBranch # 添加分支myBranch
$ git branch -d myBranch # 删除分支
创建成功后,再次查看分支
$ git branch # 查看分支和当前分支
* master
myBranch
$ git checkout myBranch # 切换到指定分支
$ git branch
$ git branch # 查看分支和当前分支
master
* myBranch
尚未推送或分享给别人的本地修改可以执行变基操作来清理历史(commit message)----git rebase
已推送至别处的提交不执行变基操作
-
--pretty=oneline
表示只显示一行哈希值和提交说明
git log --graph --pretty=oneline --abbrev-commit
4.提交代码到远程库
尝试提交一下到远程库
$ git push origin master
但是报错!!!
$ git push origin master
To https://github.com/JackMin1314/Learning_Skill.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/JackMin1314/Learning_Skill.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
根据提示需要先git pull....说明本地库不是最新的,尝试git pull origin master,还是失败
$ git pull --rebase origin master
From https://github.com/JackMin1314/Learning_Skill
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
First, rewinding head to replay your work on top of it...
Applying: This is the first time to write the message
Applying: This is the second time to write the message
Applying: Sort out some files
四、添删远程库和username、email等问题
- 输入
git config --h
可以查看很多命令,例如查看全局配置文件(系统级别)中的信息
$ git config --global -l user.name=Jack Chen user.email=1416825008@qq.com
- 输入
git config --global -l
可以查看所有信息 - 查看文档选择--unset remove a variable: name [value-regex]
$ git config --global --unset user.email # 清空 user.email 和 user.username
$ git config --global --unset user.name
- 查看信息没有任何显示直接看username 和email按
git config --global --get user.name
$ git commit --amend -m head
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address
-
重新添加name,email用
user.email
,user.name
(这里设置全局级别的)
$ git config --global user.email "1416825008@qq.com"
$ git config --global user.name "jackmin"
$ git config --global -l
user.email=1416825008@qq.com
user.name=jackmin
下面重新开始
# 克隆最新的远程库
$ git clone https://github.com/JackMin1314/Learning_Skill.git
$ git pull https://github.com/JackMin1314/Learning_Skill.git
# 修改了几次后提交,再push报错
$ git push origin master To https://github.com/JackMin1314/Learning_Skill.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/JackMin1314/Learning_Skill.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
# 尝试用最新的远程库和本地变基
$ git pull --rebase origin master From https://github.com/JackMin1314/Learning_Skill
* branch master -> FETCH_HEAD
First, rewinding head to replay your work on top of it...
# 查看当前状态没问题
$ git status
# 直接提交到远程
$ git pull origin master From https://github.com/JackMin1314/Learning_Skill
* branch master -> FETCH_HEAD
Already up to date.
$ git push origin master
Enumerating objects: 2, done.
Counting objects: 100% (2/2), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 447 bytes | 447.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To https://github.com/JackMin1314/Learning_Skill.git
f25daf1..c699f70 master -> master
成功.去github看到修改了对应目录.
转 载 注 明 出 处 谢 谢!!! ^ _ ^
网友评论