git 基本命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 git config --global user.name 'XXX' git config --global user.email 'XXX' git init // 初始化代码仓库 git add learngit.txt // 把所有要提交的文件修改放到暂存区 git commit -m 'add a file' // 把暂存区的所有内容提交到当前分支 git commit -s -m // 添加 signed-off-by 信息,在日志中增加提交者签名 git commit -a -m // 相当于git add . 与git commit –m “本次提交描述”两句操作合并为一句进行使用。 git status // 查看工作区状态 git status -s // 查看改变的文件列表简化版 git diff // 查看不在缓冲区的文件的修改内容 git diff --cached // 查看缓冲区的文件发生的改变 git diff --staged // 查看缓冲区的文件发生的改变 git diff HEAD // 是 git diff 和 git diff --cached 的合并 git log // 查看提交历史 git log --pretty=oneline // 单行显示 git reset --hard HEAD^ // 回退到上一个版本,其中(HEAD^^(上上版本),HEAD~100(往上100个版本)) git reset --hard <commit_id>//(版本号) 可回到指定版本 git reflog // 查看历史命令 git diff HEAD -- <file> // 查看工作区和版本库里最新版本的区别 git checkout -- <file> // 用版本库的版本替换工作区的版本,无论是工作区的修改还是删除,都可以'一键还原' git reset HEAD <file> // 把暂存区的修改撤销掉,重新放回工作区。 git rm <file> // 删除文件,若文件已提交到版本库,不用担心误删,但是只能恢复文件到最新版本 git checkout -b dev // 创建并切换分支 git branch // 查看当前分支,当前分支前有个*号 git branch <name> // 创建分支 git checkout <name> // 切换分支 git merge <name> // 合并某个分支到当前分支 git branch -d <name> // 删除分支 git log --graph // 查看分支合并图 /* 禁用Fast forward合并dev分支*/ git merge --no-ff -m 'message' dev git stash // 隐藏当前工作现场,等恢复后继续工作 git stash list // 查看stash记录 git stash apply // 仅恢复现场,不删除stash内容 git stash drop // 删除stash内容 git stash pop // 恢复现场的同时删除stash内容 git branch -D <name> // 强行删除某个未合并的分支 git remote // 查看远程仓库 git remote -v // 查看远程库详细信息 git pull // 抓取远程提交 /* 在本地创建和远程分支对应的分支*/ git checkout -b branch-name origin/branch-name /* 建立本地分支和远程分支的关联*/ git branch --set-upstream branch-name origin/branch-name
ssh 1 2 3 4 5 6 7 8 9 // 创建SSH Key ssh-keygen -t rsa -C 'your_email' // 关联本地仓库,远程库的名字为origin git remote add origin git@github.com:username/repostery.git // 第一次把当前分支master推送到远程时要加 -u // -u 参数不但推送,而且将本地的分支和远程的分支关联起来 git push -u origin master
tag 1 2 3 4 5 6 7 8 9 git tag v1.0 //给当前分支最新的commit打标签sh /* -a指定标签名,-m指定说明文字*/ git tag -a v0.1 -m 'version 0.1 released' 3628164 git tag -s <tagname> -m 'blabla' //可以用PGP签名标签 git tag //查看所有标签 git show v1.0 //查看标签信息 git tag -d v0.1 //删除标签 git push origin <tagname> //推送某个标签到远程 git push origin --tags //推送所有尚未推送的本地标签
reset git reset –option <commitid>
是回滚命令,option 有三个参数可选:
–mixed
,这也是默认方式(即不带参数默认是这种),回退暂存区和版本库信息,工作区的源码不会变化 ,可以重新add,重新commit。
-soft
,回退版本库信息,暂存区和工作区都不会变化 ,如果还要提交,暂存区已经 add 完毕,直接 commit 即可。
–hard
,彻底回退,版本库信息、暂存区和工作区都回退到历史某个版本 。
git 复杂操作合集 回滚某个文件
git log –pretty=oneline <file>
可以查看某个文件的修改历史。
git show commit_id <file>
可以查看对应某个commit
时期file
的内容。
git reset commit_id <file>
可以将file
回退到某个版本
执行完第3步后提示:
1 2 Unstaged changes after reset: M README.md
执行git status
,提示:
1 2 3 4 5 6 7 8 9 10 Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: README.md Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: README.md
执行git checkout — <file>
后,README.md成功回滚到指定版本。
聚合commit_msg 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 git rebase -i <commit_ID> git rebase -i master git rebase -i HEAD~<num> // squash:将这一行的 commit 与上一个 commit 进行合并 // fixup:与 squash 相同,只是不会保留这行 commit 的提交 message 信息 // 修改上一次 commit 提交的 message git commit --amend // 不过只能修正上一次的 commit。如果很多个 commit 之前就有 message 写错,就得用上我们之前说的 git rebase 了 // 自动标记这一次的 commit 为上一个 commit 的 fix git commit --fixup <commit> // 自动组织合并两个 commit git rebase -i --autosquash // 撤销过去的 commit 重建一个新的 git reset HEAD~2 git add . git commit -am "This is the new feature" git push --force
修改提交至其他分支
当前处于 A 分支,需要将此次的代码提交至 B 分支,则在没有进行 commit 之前可以进行以下操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 1、通过git stash将工作区恢复到上次提交的内容,同时备份本地所做的修改 git stash // 2、然后切换至B分支 git checkout B // 3、从git栈中获取到最近一次stash进去的内容,恢复工作区的内容,获取之后,会删除栈中对应的stash git stash pop // 4、然后进行正常的提交代码步骤即可 git add ... git commit -m "功能开发" git pull origin <分支名称> git push origin <分支名称>
本地连接远端仓库 1 2 3 git remote add origin <url> git pull --rebase origin master git push -u origin master
强制拉取最新代码 1 2 3 git fetch --all git reset --hard origin/<develop> git pull
git stash 临时保存修改 stash
命令可用于临时保存和回复修改,可跨分支。
注: 在未add
之前才能执行stash
!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 //把暂存区内的修改存储起来: git stash //切换到正确的分支: git checkout 分支名 //将存储的修改取出来: git stash pop // 继续进行提交等正常的操作 git stash [save message] git stash list git stash pop stash@{num} git stash apply stash@{num} git stash drop stash@{num} git stash clear
git submodule 管理 1 2 git submodule add xxx git clone --recurse-submodules xxx
出错解决方案合集
‘fatal:remote origin already exists’
1 2 3 git remote rm origin git remote add origin XXX git push -u origin master
如何删除 git 远程仓库项目的所有内容,重新提交所有内容
忘记添加 gitignore 文件
1 2 3 git rm -r --cache . git add . git commit -m "gitignore working"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // 未添加到暂存区 git checkout -- <filepathname> // 放弃所有的文件修改 git checkout . // add 到了缓存区的代码 git reset HEAD <filepathname> // 放弃所有缓存区代码,回退到已修改但未存到缓存区的状态 git reset HEAD . // 已经提交了代码 git reset --hard HEAD^ // 若想回退到任意版本 git reset --hard commit_id
1 2 3 4 // 删除文件夹下的所有 .svn 文件 find . -name ".svn" | xargs rm -Rf // 删除文件夹下的所有 .git 文件 find . -name ".git" | xargs rm -Rf
1 git config --global credential.helper store
文件修改后git add
了,也git commit
了,发现哪里错了或者是漏add
了一个文件。
1 2 3 4 // 添加新修改到暂存区 git add file git commit –amend -m "xxx" // 这样只会记录一次`commit` // 相当于将两次 commit 合并成了一次,保留最后一次 message 内容