Git 学习笔记
git基本操作
git --help : 查看git常见命令
git clone:得到一个项目的拷贝,
eg:git clone git://git.kernel.org/pub/scm/git/git.git 。如果访问一个Git URL需要用法名和密码,可以在Git URL 前加上用户名,并用@符号表示分割
touch file:新建一个内容为空的文件
ls -b:显示文件列表
ls -a:显示所有文件
git status (-s):查看上次提交之后是否有修改(加-s获得简短的输出)
git diff:查看未缓存的改动
git diff --cached:查看已经缓存的改动
git add . /file name:将想要的快照写入缓存
git commit:将缓存法人内容添加到仓库中,Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址
git commit -m '第一次版本提交'
git commit -am ‘修改的hello.php文件’: 如果你觉得 git add 提交缓存的流程太过繁琐,Git 也允许你用 -a 选项跳过这一步。
git reset HEAD file : 取消某文件的缓存(我们将某文件add到缓冲区后)
git rm:从git中移除某个文件,就必须从已经跟踪文件清单中移除,然后提交。git rm -f file:如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
git rm --cached file : 如果把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 --cached 选项即可
git mv README README.md :用于移动或重命名一个文件目录。软连接
分支管理
git branch (branchname) : 创建分支
注:在当前分支(A)下创建新的分支(B),那么B和创建时刻的A是相同的(可以认为B复制了A)
git checkout(branchname):切换分支
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
git merge:合并分支(你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。 )
git branch:列出分支
git branch -r:列出所有远程分支
git branch -a : 列出所有本地和远程分支
eg: *master :此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。
当你执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。
如果我们要手动创建一个分支。执行git branch (branchname)即可
echo .... >filename : 创建文件并将 .... 作为文件初始内容
git checkout -b (branchname) :创建分支,并切换到该分支下
git branch -d (branchname):删除分支
git merge : 合并分支(一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支 )
cat file / cat file1 file2> traget_file : 打印文件/将多个文件合并到一个文件
查看提交历史
git log : 列出历史提交记录
git log --oneline:简洁版列出历史提交记录
git log --reverse --oneline : 逆向显示所有日志
git log --author= authorname --oneline :查找指定用户的提交日志
git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges : 指定日期
如果我要看 Git 项目中三周前且在四月十八日之后的所有提交,我可以执行这个(我还用了 --no-merges 选项以隐藏合并提交):
标签
git tag -a v1.0 85fc7e7 : 给85fc7e7追加标签
git tag -a v1.0 : 给最新一次提交打上标签
git tag -d [name] : 删除版本
git tag -r : 查看远程版本
git push origin [name] : 创建远程版本(本地版本push到远程)
git push origin :refs/tags/[name] : 删除远程版本
git pull origin --tags : 合并远程仓库的tag到本地
git push origin --tags : 上传本地tag到远程仓库
Git Github
git remote add [name]+[url]:添加远程仓库
git remote set-url --push [name] + [newurl]:修改远程仓库
git pull [remoteName]+[localBranchName]:拉取远程仓库
git push [remoteName]+[localBranchName]:推送到远程仓库
git push origin test:master : 提交本地test分支作为远程的master分支
提交到Github
git remote add origin git@github.com:csushl/runoob-git-test.git :添加新的远程仓库
git push -u origin master
git push [alias] + [branch] : 以上命令将你的 [branch] 分支推送成为 [alias] 远程仓库上的 [branch] 分支
git remote (-v) : 查看当前配置有哪些仓库(加-v,还可以看到每个别名的实际链接地址)
在线修改,然后本地更新修改
git fetch origin(仓库)(master): 从远程仓库下载新分支与数据到本地(不合并)
该命令执行完后需要执行git merge 远程分支到你所在的分支。
git merge origin/master(分支) : 从远端仓库提取数据并尝试合并到当前分支
git pull origin master:是将远程主机的master分支最新内容拉下来后与当前本地分支直接合并 fetch+merge
推送到远程仓库
eg:
$ touch runoob-test.txt # 添加文件
$ git add runoob-test.txt
$ git commit -m "添加到远程"
master 69e702d] 添加到远程
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 runoob-test.txt
$ git push origin master # 推送到 Github
git push origin master : 推送到 Github
git remote rm (仓库名):删除远程仓库
git reset
git reset --soft :回退到某个版本,只回退了commit的信息,不会回复到Index file一级(即git add 一级),如果还要提交,直接commit即可。 参数只告诉git 讲其他的commit重置到HEAD,就此而已。index和working copy中的文件都不改变。
git reset --mixed (默认): 回退到某个版本,只保留源码,回退commit和add 。 改变HEAD和Index,指向那个你要reset到的commit上。而working copy文件不被改变,当然会显示工作目录下有修改,但没有缓存到index中。
git reset --hard : 三个地方同时改变(比较危险,执行之后,你的本地修改可能就丢失了)。
git stash
默认情况下, git stash 命令会把以下修改存储到一个新的堆栈中。堆栈中的内容(stash)可以被所有分支访问。
-
暂存区中的修改
-
工作区中已经存在的文件的修改
也就是说,默认情况下,git stash命令不会存储下列文件。
-
工作区中新增的文件(untracked files)
-
被版本库忽略的文件(.gitignore中定义的)
git stash -u :如果你还想要存储 untracked files,可以使用 -u 选项 .
git stash -a : 如果你还想要存储 untracked files 和被版本库忽略的文件,可以使用 -a 选项。
但是,一般不推荐这么做,因为既然是被版本库忽略的文件,就没有必要再存储起来。除非你有非常特别的需求。
git stash save "message" : 在git stash 时候添加一个message注解
执行 git stash 命令后,工作区就恢复到了上一次 git commit 时的状态。具体表现为:
-
暂存区中的修改看不见了。
-
工作区中已经存在的文件的修改也看不见了。
-
如果使用了 -u 选项,工作区中新添加的文件对于工作区也看不见了。
这样工作区就干净多了。使用 git diff 和 git diff --cached 也看不到工作区和暂存区中的修改了。因为它们都被存储到了一个堆栈中。
然后,我们就可以新建分支,切换到新的分支来处理其他的需求。
git stash save -u "message" : 储存到堆栈
git stash list : 查看堆栈中的stash列表(堆栈中可能会有多个 stash,通过 stash_id 进行区分)
git stash show / git stash show stash@{id} / git stash show -p :查看stash的内容
git stash apply stash@{id}:将堆栈中的指定 stash 应用到工作区(保留堆栈的内容)
git stash apply ( stash@{0} ) : 将堆栈中的最近一次 stash,应用到工作区(保留堆栈的内容)
git stash pop : 将堆栈中的最近一次 stash,应用到工作区(删除堆栈的内容)
git stash drop stash@{id} : 删除指定的stash
git stash drop : 删除最近一次的stash
git stash clear : 删除所有的stash
git rebase
--rebase不会产生合并的提交,它会将本地的所有提交临时保存为补丁(patch),放在”.git/rebase”目录中,然后将当前分支更新到最新的分支尖端,最后把保存的补丁应用到分支上.
rebase的过程中,也许会出现冲突,Git会停止rebase并让你解决冲突,在解决完冲突之后,用git add去更新这些内容,然后无需执行commit,只需要:
git rebase --continue就会继续打余下的补丁.
git rebase --abort将会终止rebase,当前分支将会回到rebase之前的状态.
cherry-pick
git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作(操作的对象是commit)。例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了。
就是对已经存在的commit进行再次提交:
git cherry-pick commit-id
可以使用git log查询commit id
其他
mkdir filename :当前目录下创建文件
pwd : 显示当前目录