Git 笔记

*

廖雪峰 git 教程


git clone git地址

git pull 拉取文件到本地

如果需要提交文件,先push

废弃某个加在了缓冲区的文件
git checkout -- aa.txt

------------- git添加一个文件 --
git add aa.txt

------------- git撤销本地所有未提交的更改 [有效]-------------------
1. git clean -df
2. git reset --hard
第一个命令只删除所有untracked的文件,如果文件已经被tracked, 修改过的文件不会被回退。
而第二个命令把tracked的文件revert到前一个版本,对于untracked的文件(比如编译的临时文件)都不会被删除。


====================
git push origin master

gitk 可以打开可视窗口

================== 20170511 ============
1,新增加一个文件,修改从工作区添加到stage区
git add file1 [file2] [file3] 可以添加多个文件
2,git commit -m "你的备注"

git init 初始化仓库

git checkout -- filename, 舍弃这个文件的修改

git diff filename,查看文件修改的地方

修改文件后,提交时,依然两步走,add,commit
如果直接commit提交,会说 not staged for commit,意思是文件还没有准备好提交

git log --pretty=oneline 可以看提交记录

============== 版本回退 =========
当前版本是HEAD,前一个版本是HEAD^,再前一个版本是HEAD^^,往上100个版本是 HEAD~100
git reset --hard HEAD^,返回到上一个版本,开始一直出错,后来键盘改为大写 写HEAD^,就可以了

如果【git bash】窗口还没有关闭,上面用git log是看到了一长串id,例如 9c4102.....,
如果恢复到上面几个版本后,后悔了,可以重新找回来,例如 git reset --hard 9c4102,就这几位数字就可以,能唯一标识就行
a001,b002,c003,版本,从c一直还原到a,然后又想恢复到c版本,则可以用上面的 git reset --hard c003XX

如果【git bash】关闭了,例如第二天开机来找,后悔了,又忘记了commit id,怎么办,git reflog
可以记录你每次的命令记录
==========
HEAD指向当前版本,git reset --hard commit_id 允许你在各个版本中来回穿梭
想回到过去,git log 看一下你想去过去哪个版本
想回到未来,git reflog 看一些你想去当前时光轴往后(即未来)的 哪个版本
==========

git diff HEAD filename 工作区和当前版本比较
============== 工作区,stage区,master
git checkout -- filename,修改还没有add到暂存区了,舍弃修改,(从工作区舍弃修改)
git reset HEAD filename,修改已经add到暂存区了,舍弃修改(从stage区舍弃stage状态,但还在工作区),
然后还辅以git checkout -- filename,让工作区的也舍弃修改,世界和谐了
==============
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- filename。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
==============

提交的文件删除后,git检测到了
如果确实要删除,两个步骤:1,git rm 文件名,2,git commit -m "备注:删除了某个文件"
如果这个文件是误删,则 git checkout -- test.txt,(git checkout)其实是用版本库中的版本替换工作区的版本,如论工作区修改或删除,都可以一键还原
---------------
远程仓库
git@192.168.0.60:luojq/learngit.git

一,本地先有了一个learngit的项目,然后push到远程仓库
1,在gitlab上面建立了一个learngit的项目,然后让本地与远程仓库关联
git remote add origin git@192.168.0.60:luojq/learngit.git
2,把本地推送给远程,-u是因为远程仓库现在是空的
git push -u origin master
3,以后本地提交,
git push origin master ?? origin/master
二,远程仓库先有了一个项目,然后clone到本地
git@192.168.0.60:archive/workprocess.git
git clone git@192.168.0.60:archive/workprocess.git
git@192.168.0.60:luojq/catAPI.git

========== 分支
新建一个分支dev,并切换到该分支上,【-b 表示创建并切换】
git checkout -b dev
相当于1,git branch dev, 2,git checkout dev

在分支上修改,然后切换到master上,合并分支的修改,步骤:
1,git checkout dev 切换到分支dev上,然后去修改东西,例如readme.txt
2,git checkout master ,切换回到主干
3,git merge dev,在主干上合并dev分支的修改【合并某分支到当前分支】
4,git branch -d dev ,dev完成了它的使命,删除该分支,这 过河拆桥啊

显示的好看一些
git log --graph --pretty=oneline --abbrev-commit

使用【强制禁用fast forward模式合并分支:--no-ff】
git merge --no-ff -m "merge with no-ff" devbranch


git stash 暂存
git stash list 查看
1,git stash apply [stash@{0}] 重新恢复[指定的stash,如果有多个]
2,git stash drop 删除暂存stash

1和2 可以合并为 git stash pop,恢复并删除
说明stash 是一个栈


git branch -D <分支名>,如果一个分支上的修改已经add,commit了,然后删除,会提示没有merge,此命令强制删除分支

============= 从远程仓库clone下来的项目 ==========
1,git remove -v 查看远程 抓取和推送的 具体信息
2,
git push origin master
git push origin <目的分支例如dev>

在本电脑的另一个目录clone下远程仓库,
然后
想把远程的dev 创建到本地来,
git checkout -b dev origin/dev 出现问题,原因是我clone前 之前的一个版本没有将dev分支 push 到远程仓库
所以先 1, git pull
2, git checkout -b dev origin/dev 就可以了

3,我在dev分支上,git push origin dev,将本地dev分支的更新push到远程dev分支上去了
共三步,add,commit,push

其他人在自己的dev分支修改后,提交到了远程的dev分支
你想把远程的dev更新 同步到 本地的dev分支上
1,git branch --set-upstream dev origin/dev (指定本地dev 与 远程dev 的链接)
2,git pull(仅这步是不行的)

===============================
因此,多人协作的工作模式通常是这样:

首先,可以试图用git push origin branch-name推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。

这就是多人协作的工作模式,一旦熟悉了,就非常简单。
=============================================

标签

git tag v1.0
git log --pretty=oneline --abbrev-commit
git tab v0.9 6577556 ,有时候忘了给之前的打一下标签,可以git log 查看标签,然后 此处末尾的是commit_id

git show <tagname>

 =================

===================
工作的模式
1,git checkout xzg-ljq ,切换到自己的分支
2,git merge xzg 把xzg分支最新的东西拿下来,(还是从远程拿??)
3,xzg-ljq分支修改后,commit,(如果需要push到远程xzg-ljq分支,git push origin xzg-ljq)

4,然后切换到xzg,git checkout xzg

5,然后本地 xzg 从本地 xzg-ljq分支merge东西,git merge xzg-ljq

6,开通了xzg push到远程的权限后,与其他同事一起合代码,push到远程origin xzg ,, 【git push origin xzg】


=========== 一次性添加所有文档 ==============
git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。

git add -u :他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)

git add -A :是上面两个功能的合集(git add --all的缩写)
===================
git push origin/xzg

git config user.name 查看当前git用户

==============================
如果想合并特定的提交到某一分支上
例如 xzg-ljq 某一次提交 想合并到 xzg分支上
76cada - 62ecb3 - b886a0 [xzg-ljq],现在xzg-ljq提交了三次

1,只想合并62ecb3 到xzg 上
git cherry-pick 76cada - 62ecb3

2,想合并某一分支的一系列commits,例如76cada - 62ecb3
可以基于xzg-ljq分支在新建一个分支,作为中间桥梁
git checkout newbranch 62ecb3 //62ecb3是那个系列的最后一个commit
git rebase --ontomaster 76cada^,(人家举例是合并到master上,那我这里难道ontoxzg-ljq??,待测试)

参考文章: 

Git合并特定commits 到另一个分支

*

有问题在公众号【清汤袭人】找我,时常冒出各种傻问题,然一通百通,其乐无穷,一起探讨


原文地址:https://www.cnblogs.com/qingmaple/p/6847151.html