git 不完全教程

概念

  • 工作目录:当前所见,Working directory
  • 暂存区域:以后要提交到仓库的文件,称为Index或者staging area
  • Git 仓库:持久化存储快照的地方,HEAD指针所指向的地方

Git 基本工作流程:

  1. 修改文件,会被git觉察
  2. 手动选择修改过的文件以暂存文件。
  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

git 设置命令

1.git config 设置本地用户信息

git config --global user.name "John Doe"

git config --global user.email johndoe@example.com

如果使用了 --global 选项,就是全局设置的。

2.git config --list 列出所有 Git 的配置选项

3.git help [你想了解的git命令],获得详细解释

git 暂存操作命令

1.git init 创建仓库

2.git status 查看git状态

创建或修改文件,会被git发现差异,git status 可以查看这些变动

3.git add [fileName] 暂存或追踪文件

git statu查看git状态是查看的当前git所追踪的文件的变动状态,之所以git不自动追踪所有文件的原因是给用户的选择空间。所以才有暂存的存在,暂存过的文件就会被git做diff比较,进而可以将暂存区的内容存入仓库。加入暂存这一操作,被git称作追踪track。所以追踪一个文件和暂存一个文件本质区别不大。所以都适用git add一个命令完成。如果你不知道哪些需要增加到暂存,git status会告诉你

想要增加更多或者全部文件,可以使用git add *或.或-A或-all,如果想要配置不需要追踪的文件,可以在仓库跟目录下创建.gitignore,来看一个实际的例子:

$ cat .gitignore

*.[oa]

*~

第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。 第二行告诉 Git 忽略所有以波浪符(~)结尾的文件

4.git checkout [fileName] 从暂存区取回并替换工作区文件

5.git reset [fileName] 删除暂存区的内

6.git diff fileName 查看改了具体内容

总结:暂存一方面起到临时保存的作用,还有追踪的作用。通过暂存,可以简单的保存,但是作用有限 ,比如,你暂存了某个文件并再次做了修改,如果你从暂存区checkout后,你就再也找不到最新修改的部分了。并且,如果你多次暂存了这个文件,暂存区只有最近一次暂存状态,你不能查看前几次修改的快照。所以对此需求,就需要将快照持久化,也就是commit提交到仓库。

对git来说,有如上流程,add the file, edit the file, stage the file,remove the file我们已经说过,完整commit提交后,原本暂存区中保存的修改了的内容就会被清空,git会认为当前是环境是干净的,没有被修改过的,原因有二:

1.既然已经将修改持久化保存,就算清空暂存区也不会出错。

2.如果暂存区不会清空,就可以无限提交,显然这是不被允许的。

git 仓库操作命令

1.git commit -m '提交时的文字描述'

该命令可以提交暂存区内容到仓库,也就是将暂存区的内容持久化保存为仓库中的快照,成功提交后,git将打印这次提交的快照的索引号,如果你愿意的话可以记住,很多gui工具都不需要你记,有些时候,如果你觉得先把修改提交到暂存区再提交到仓库多此一举,实际上可以一步直接将修改提交到仓库

git commit -a -m '提交时的文字描述'

2.git mv old new

如果你移动了或者重命名了一个文件,git就认为这是新的,实际上,我们想让git知道这是仓库中的文件而不是新文件你需要git mv README.md README,为什么要让git知道呢?

a.如果git不知道,那就认为是新文件,

b.如果git不知道,在多人合作时,合并代码就会出问题

3.git log 查看历史提交

如果你只想看最近两次的历史,使用git log -2

如果想看历史详细差异,git log -p

精炼的查看历史信息,git log --pretty=format:"%h - %an, %ar : %s"

--graph可以可视化展示分支图

git reflog 查看历史操作,用于挽尊

4.git commit -amend '提交时的文字描述' 重新提交

有时你在某次提交后,发现漏提交了一些文件,或是某次提交信息不够完善,总之你想重新编辑这次提交,你可以做完一系列操作后使用这个命令

5.git reset --hard/soft/mix [索引号]. 切换到某一次提交

但凡你不知道你在做什么,请操作之前一定提交后推送到远程,在工作目录保持干净的情况下在使用这个命令。
git reset file,会将暂存区的file删去,也可以git reset 清空暂存区
git reset commit file,如果commit不是head,将commit的file 放入暂存区

6.git rm --cached [fileName] 删除取消追踪仓库中的某个文件

如果想删除仓库和本地目录的文件git rm

7.git update-index --assume-unchanged file 不再追踪本地某文件,而不删除仓库中的文件

8.git revert commit 撤销某次提交

可以把他看成快照head与快照head-某次commit的合并,而且会出现奇怪的冲突。不是推荐做这样的事

9.git checkout file 撤销文件的修改

他会先从暂存区找file,如果找不到,在当前仓库找,找到了就用来替换工作区的文件,git checkout commit file 直接将commit的file替换工作区

git 分支操作命令

1.git branch testing 创建但不切换分支

这会在当前所在的提交节点上创建分支

2.git checkout testing 切换分支

git checkout -b testing 创建并切换分支,这个比较混淆,算作特殊用法。

git checkout -b testing origin/testing从远程取得一个分支并在本地创建

3.查看分支

git branch 查看本地

git branch -r 查看远程分支

git branch -a 查看所有分支

4.删除分支

git branch -d testing

git branch -D testing 强制删除

git branch -r -d 删除远程分支

5.git merge master 合并分支

开分支后,必然会做一些改动,且必然要合并到主分支上。如果当前是testing分支,git merge master就会将merge合并到testing,merge有可能会出现冲突,需要手动解决冲突,然后commit。拉取远程分支时git pull也会做一次合并。解决冲突的工具有很多,使用vscode编辑器足以,方法很简单,打开冲突文件即可

git 远程仓库操作命令

1.git clone url 克隆远程仓库

2.git remote 查看远程仓库服务器

通常origin 是默认的远程服务器

git remote -v,查看远程服务器url地址

3.添加和移除远程服务器

git remote add <远程服务器> <url地址>

git remote remove <远程服务器>

4.拉取远程最新代码

git fetch origin testing 仅拉取

git pull origin testing 拉取并合并,如果已经有追踪分支,origin可以省略

git pull origin master --allow-unrelated-histories 拉取忽略不相关

5.跟踪分支,本地和远程分支的联系

git checkout -b testing origin/testing或是git clone创建的分支自带了与远程的联系

git branch -vv 可以查看所有分支关联的远程分支

git push -u origin mastergit branch -u origin/testing 手动设置与远程分支建立联系,建立关系后,git push就可以直接推送到远程

6.git push 推送

git push [remote-name] 分支名,等价于下面

git push [remote-name] 本地分支名:远程分支名

如果远程没有该分支,会在远程自动创建,但必须建立与远程的联系

注意: 如果本地分支的最新进度<= 远程分支,则远程将拒绝你的push,必须先pull(也就是先merge远程),才能push

7.删除远程分支

git push origin --delete testing

git branch -r -d testing

为了正常与远程对接,一般操作流程如下:

1.克隆远程

git clone url

2.与远程远离联系

如果远程创建了分支,要切换到那个分支git checkout -b tt origin/tt

如果本地创建了分支,要推送到远程(远程没有这个分支),git push [remote-name] 本地分支名:远程分支名,然后要绑定远程分支,git branch -u origin/分支名

3.对于http形式的远程url,最好做一下面密码操作

如果远程是https连接的,每次都需要输入密码,为了避免这样,可以克隆时手动改写一下url如,http://用户名:密码@远程仓库httpsurl,当然你也可以改写remote地址达到同样效果:git remote set-url http://用户名:密码@远程仓库httpsurl

保持工作目录干净:

使用git reset --hard 并不能完全保证当前工作目录的干净,比如你从远程合并了master分支,出现了冲突,没提交直接reset到合并之前的commit,reset之后发现多出来了好多未跟踪的文件或文件夹,为什么会有多出来的文件,因为你在当前commit上,而你之前合并没提交,所以远程的commit并未成功写入本地,也就是说远程追踪的有些文件还没在本地追踪,你reset的时候,本地仓库只管你追踪的文件,多出来不管,如果要完全恢复到该commit的状态,git clean就行了,它将移除未追踪的文件,git clean -df可以把目录一起删了,所以git reset 通常和git clean连用。

git图形界面软件推荐:

1.gitahead:三端都有,界面直观,而且非商业免费使用。更新勤快

2.gitup:仅mac端。

posted @ 2018-09-27 22:44  Yang.kid  阅读(272)  评论(0编辑  收藏  举报