分布式版本控制
客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
近乎所有操作都是本地执行
正是因为每次克隆都是对代码仓库的完整备份,所以在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。 如果你习惯于所有操作都有网络延时开销的集中式版本控制系统,Git 在这方面会让你感到速度之神赐给了 Git 超凡的能量。
工作区、暂存区、版本库
工作目录是对项目的某个版本提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区(index或state)是存储文件的修改的地方,以便将来所有修改完成后一起提交。
版本库就是.git文件夹(默认是隐藏的)
四种状态
- 已追踪(tracked):表示文件已被git追踪。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。初始化仓库后再添加新文件,新文件就是未追踪(需要git add一下)
- 已修改(modified):表示修改了文件,但还没保存到暂存区中。
- 已暂存(staged):修改后提交到了暂存区中,但还没提交
- 已提交(committed):将暂存区中的修改提交到当前分支中
可用 git status命令查看状态
基本的 Git 工作流程如下:
1、在工作目录中修改文件。
2、暂存文件,将文件的快照放入暂存区域。
3、提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
注意:提交时记录的是放在暂存区域的快照。 任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理,所以在commit之前,用git status查看一下还有哪些变化没add。然后再commit
获取 Git 仓库
有两种取得 Git 项目仓库的方法。 第一种是在现有项目或目录下导入所有文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库。
远程仓库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。
本地仓库连接远程仓库
git remote add zzh https://github.com/zhangZhiHao1996/learngit2.git
zzh是远程仓库的缩写,默认名称为origin,多人协助时,名字就好区分
git remote 查看远程仓库的简写
分支
当我们代码写了一半,想保存进度时,我们提交到版本库中就可以了,但是不完整的代码导致其他人从版本库中获取代码后,出现问题。
我们可以利用分支来解决,我们可以创建分支,在分支上来保存进度,在分支上可以随时提交,只要分支没有合并到主分支上,那其他人就看不到你的分支。
分支的应用场景远远不止这一个,还有很多,上面的应用场景不push到远程仓库一样可以在本地随便commit。具体可以参考下面的链接。
工作流程
首先clone远程仓库
进入本地克隆的仓库
git remote -v 可以查看远程仓库(已连接远程仓库)
在本地的git仓库中修改,提交。
push到远程仓库
fetch拉取其他人提交到远程仓库的修改,(其实就是更新本地origin/master的指向)
merge合并分支到本地的分支上。
如果你从这里克隆,Git 的 clone 命令会为你自动将其命名为 origin,拉取它的所有数据,创建一个指向它的 master 分支的指针,并且在本地将其命名为 origin/master。 Git 也会给你一个与 origin 的 master 分支在指向同一个地方的本地 master 分支,这样你就有工作的基础。
在本地的master工作,push实际上就是推送到远程仓库,并使远程仓库的master与本地的合并,fetch就是更新在本地的origin/master指针,本地master还没变,所以要merge,当我push我在本地创建的分支时(zzh分支)就报错了
fatal: ‘zzh’ does not appear to be a git repository
fatal: Could not read from remote repository.
所以要理解远程追踪(一般情况下是追踪的默认分支,master)
不管是push、fetch实际上就是在更新master(目前是这么理解的),以后有更多的git使用经验后再去理解。
目前公司(一步汽车)只用了master,并没有其它分支,团队都是在远程服务器中clone后工作,然后push、fetch、merge
配置git
我在用公司离职人员的电脑时,git还是他的配置,我用git提交还是显示他的提交,我们需要更改一下git配置
git config --global user.name “Your_Username”
git config --global user.email username@xxx.com
git命令
git init 初始化git仓库
git add <filename> 添加内容到暂存区(从已修改状态到已暂存或从未追踪状态到已暂存状态)
git commit -m "提交信息" 提交到暂存区的快照到分支中(从已暂存状态到已提交)
git commit -a -m "提交信息" 提交已被追踪的文件到分支中(可跳过add环节,从已修改状态到已提交状态)
git status 查看git状态
git diff 查看已修改状态文件的变化
git diff --stage <filename> 查看已暂存状态文件的变化
git log 查看所有提交日志
git log -p -次数 查看最近几次的提交日志,并显示每次的内容差异
git log --stat 查看所有提交日志的统计(总结性的内容)
git log --pretty=oneline 查看所有提交日志(在一行显示)
git log --pretty=format 按定制的格式打印日志
git rm <filename> 删除已修改状态的文件
远程仓库
git remote add <shortname> <url> 添加一个远程仓库,shortname可以用来代替url
git remote -v 查看远程仓库
git remote show <remote-name> 查看远程仓库的更多信息
git remote rename <oldname> <newname> 将远程仓库重命名
git remote rm <remote-name> 移除远程仓库
git fetch <remote-name> 从远程仓库拉取
git push 将本地修改推送到远程仓库中
git clone <url> 克隆远程git仓库
撤销操作
git commit --amend - m "信息" 可以重新修改提交的信息或添加漏掉的修改
git reset HEAD <filename> 取消暂存的信息(从已暂存状态到已修改)
git checkout -- <filename> 取消修改的信息(从已修改到状态到已追踪)或从版本库中恢复删除的文件(实际上都是从版本库中恢复的)
分支
git branch 查看所有分支
git branch -d <分支名> 删除分支
git branch <分支名> 创建新分支(并不会自动切换到新创建的分支上)
git checkout <分支名> 分支切换
git checkout -b <分支名> 创建新分支并切换到新分支上(上面两个命令的缩写)
git merge <指定分支名> 将指定分支与当前分支合并(注意指定分支依然存在,也并没有改变,只是当前分支融合了与指定分支不同的地方。所以我们要想更新master,是要切换到master分支上,再融合其他分支)
git branch -v 查看所有分支和每个分支最后的一次提交
git branch --merged 只显示和当前分支合并过的分支
git branch --no-merged 只显示和当前分支没有合并过的分支
git fetch 从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并(详细的可以看下面的链接)
git merge 将拉取的数据合并到本地当前分支中(远程跟踪分支合并?这点没理解完整)
git push (remote) (branch) 推送分支到远程仓库中,remote是服务器名(默认是origin),branch是分支名(默认是master)