总结(最常用)
- git add 文件名 ; (git add --all)
- git commit -m "备注" ;
- git push 远程链接name (要push的)本地分支名 :(希望push到的)远程分支名 。
(1)终端机常用命令
| Windows | Linux/macOS | 说明 |
|---|---|---|
| cd | cd | 切换目录 |
| cd | pwd | 获取当前目录 |
| dir | ls | 列出当前文件列表 |
| mkdir | mkdir | 创建新目录 |
| - | touch | 创建文件 |
| copy | cp | 复制文件 |
| move | mv | 移动文件 |
| del | rm | 删除文件 |
| cls | clear | 清除(终端)画面的内容 |
eg:
cd d:
cd "softwares\git\git\tmp\git-practice"
(2)vim基本操作:
(3)git使用前的设置
- 设置用户名和邮箱:
git config --global user.name "xxx" git config --global user.email "xxx@163.com"
- 查看设置:
git config --list
配置文件是保存在计算机用户账号文件下的.gitconfig文件,直接修改该文件中的内容,和使用git命令有相同的效果。
第五章 开始使用git
- 初始Repository: 在自己想建立仓库的目录下执行:
git init
(然后该目录下会生成.git。 删除这个.git,Git就会失去对这个目录的失去控制权。)
- 查看状态:
git status
- 把文件交给git(暂存区):
git add 文件名
--all 和 . 的区别:
git add . 是把当前目录及子目录加到暂存区;
git add --all 是把项目中的所有异动都加到暂存区(无关当前目录/路径)。
- 把暂存区文件提交到存储区 ( 仓库 Repository):
git commit -m "提交时写的注释备注"
整体提交过程总结(二段式):
- 查看记录:
git log
或
git log --oneline
或
git log --oneline --graph
-
提交记录太多时,筛选性地查询:
- 按作者名查询:git log --oneline --author="lsk" ;
- 按多个作者之一查询: git log --oneline --author="lsk|shao" ; (“\”是转义字符;“|”是或运算)
- 按关键字查询: git log --oneline --grep="练习" ; ……
-
删除提交过的文件: (1)直接删除:
首先删除本地文件:rm welcome.html:
然后 git add 文件名;
最后 git commit
这样,仓库里的文件就也被删除了。
(2)使用git命令:
git rm welcome.html 。 (使用git命令 = 省了一个add步骤)
再git commit,
并不删除文件,只是让它不再被Git控制:
git rm welcome.html --cached;
(这样welcom.html文件就变成Untracked状态了。)
变更文件名:
(1)直接改名:
先改名:mv welcome.html hello.html;
再重新git add; (改名 = 删除原文件然后新建了文件);
再git commit 。
(2)使用git命令:
git mv welcome.html hello.html 。 (使用git命令 = 省了一个add步骤)
再git commit。
修改Commit记录:
(1)使用 --amend 修改最后一次的commit:
git commit --amend -m "此处写修改后的备注注释"
(虽然看起来是修改了上一次的注释信息,但是本质上这是一次新的commit。)
追加文件到最近一次的Commit:
正常的git add ;
然后 git commit --amend --no-edit 。 (参数--no-edit 的意思是“我不要编辑Commit信息”)
新增目录:
空的目录/文件夹 无法被提交,所以在这个文件夹里任意新建一个文件即可,
eg:.keep / .gitkeep (空文件) 。
然后再add、commit即可。
有些文件不想放在Git里:
如果不想把某些重要文件或无用文件放在Git中,可以通过.gitignore文件来实现:
新建.gitignore文件:touch .gitignore ;
然后编辑其内容:(在文件中写上不想上传的文件名称,包括路径)
如果想无视忽略规则,在上传文件时加上”-f“即可:git add -f 文件名 .
5.10 查看特定文件的Commit记录:
git log 文件名 或 git log -p 文件名 (-p参数可以看到每次的改动内容)
5.11 查看代码是谁写的:
git blame 文件名
5.12 恢复被删除的文件:
git checkout 文件名 或者 git checkout .
(注意"." , 是恢复全部被删除文件的意思) (git checkout 会切换到指定分支,但如果后面接的是文件名或路径,则会把文件从.git目录中复制一份到当前工作目录。)
5.13 commit之后后悔了,想拆掉重新来:
git reset HEAD^ (回滚一次)
git reset HEAD~2 (回滚二次)
git reset ea80bd5 (ea80bd5 是git status中看到的想要回滚到的commit记录的标识码)
reset的三个参数:
| - | --mixed | --soft | --hard |
|---|---|---|---|
| commit拆出来的文件 | 放回工作目录 | 放回暂存区和工作目录 | 删除 |
5.14 不小心使用--harf模式Reset了某个Comiit,想要救回来的话:
只要知道对应Commit的标识码就可以:git reset ea80bd5 --hard 。
如果Commit记录不见了看不到标识码,则可以使用 git reflog 或 git log -g 进行查看。
5.15 HEAD是什么?
HEAD是一个指标,指向某一个分支。
5.16 只Commit一个文件的部分内容:
git add -p 文件名 ;
之后通过选项e ,进入编辑器 删除不想提交的内容,然后保存。(不会影响到工作目录下的文件)
5.18 .git目录
Git的4种对象:Blob、Tree、Commit、Tag.
关系如下:
第六章 分支
6.2 使用分支
| 操作 | 命令 |
|---|---|
| 查看当前分支 | git branch |
| 新建分支 | git branch 分支名 |
| 修改分支名称 | git branch -m 修改前的分支名 修改后的分支名 |
| 删除分支 | git branch -d 分支名 |
| 切换分支 | git checkout 分支名 |
| 合并分支 | git merge 被合并的分支名 |
6.3 理解分支的概念
切换分支时,Git做了两件事:
(1)根据对应的Commit(内容)更新暂存区和工作区;
(2)变更HEAD的位置。 (可根据上图理解)
(切换分支并不会影响未提交的改动。)
6.4 合并分支
先切回主分支(想保留的分支),然后 git merge 被合并的分支名。
6.5
远程仓库
添加远程库:
git remote add [shortname] [url] 。
eg: git remote add remote 远程仓库的网址;(很奇怪为什么几乎所有的教程都用了origin这个名字)
重命名远程仓库:
git remote rename [old-name] [new-name]
删除远程仓库(解除与远程仓库的关系):
git remote rm [shortname]
git push的格式和git pull类似:
git push <远程主机名> <本地分支名>:<远程分支名>
分支推送顺序的写法是<来源地>:<目的地> (所以pull是反过来的)。
git push常见用法:
(1)
git push origin master
该命令的作用是将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
git push origin :master
等同于
git push origin --delete master
(2) 如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略:
$ git push origin 。
如果当前分支只有一个追踪分支,那么主机名都可以省略:$ git push 。
如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用
git push:
$ git push -u origin master
(3)
如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。
这时,如果你一定要推送,可以使用–force选项:
$ git push --force origin 。
上面命令使用–force选项,结果导致在远程主机产生一个”非直进式”的合并(non-fast-forward merge)。除非你很确定要这样做,否则应该尽量避免使用–force选项。
git pull/push 的两个常见问题:
- (1)多人合作时,本地仓库和远程仓库各自有不同内容(/更改),无法push
大致意思是; 别人上传到远程仓库后,你没有及时的同步(/拉取)到本地,但是你同时又添加了一些内容(提交),以致于你在提交时,它会检测到你之前从远程仓库拉取的时候的仓库状态和现在的不一样。于是,它为了安全起见拒绝了你的提交(然后就报了这个错误)。
解决方法:
先把git的东西fetch到你本地然后merge后再push;
git fetch origin master
git merge origin FETCH_HEAD
先抓取远程仓库的更新到本地,然后与你的本地仓库合并,(如果有冲突就要解决冲突后再合并,冲突问题比较复杂,这里就不详细说了),这样就可以使远程仓库和你本地仓库一致了,然后就可以提交修改了。
这2句命令等价于
$ git pull origin master
但是使用git fetch + git merge 更加安全。
- (2)新建仓库时,第一次push,提示本地和远程有不同的历史( 两个分支是两个不同的版本,具有不同的提交历史)
解决方法:
git pull origin master --allow-unrelated-histories
意思是:可以允许不相关历史提交,强制合并 。
一个疑问
一个关于push到远程仓库的小问题:
- push到远程仓库后,本地reset回滚后commit后再push,会报冲突(报错:non-fast-toward)。 本地回滚了,但远程仓库没有回滚,此时push就会报错:non-fast-toward。这种情况该怎么办?