XCode source control: view changes for one file - xcode

Is it possible to view a "timeline" (history) for a selected file for like 50 commits? I mean changes made to this particular file and and view commits when they were made and users who changed them? I know Xcode got some powerful version control features, I just can not find this one.

What it sounds like you want is the "Blame View", if we were on the terminal you could write git blame <file-name> to see the commit/time/and user for every single line of a particular file. In Xcode you can accomplish the same thing by activating the blame view. I've posted a picture to show you where the Blame View button resides. From there you should be all set.

For xcode 11.0, If you select a file, changes for that file is available on right panel.

The commit history is in the Version Editor.
Select the file for which you want to see the commit history. Then go to View > Version Editor > Show Version Editor (or just select the Comparison view from the top-right toolbar icon - same place as the Blame view).
Clicking on the commit label below the editor will reveal the history including dates.

Yes. Xcode's Comparison view is exactly for that. When you select a source file, and choose comparison view, you have a time-machine like user-interface that besides letting you compare any two versions of the file, will also present (when you hover) all the commits of the file with their descriptions. This UI opens when you click the clock button in the bottom between the two versions of the .
Pay attention, that Xcode will list all the commits, but will fail to show the content of versions of the file if the file-name or path changed. I think Xcode makers thought that because sources are considered "different" if they are named differently or located differently, there's no point in showing them. It may be, though that they just overlooked the --follow parameter to git.

Xcode 13
Enable Code Review (default: cmd+shift+opt+Enter to toggle)
On the right of the bottom bar (or if you have the debug area opened: the bar that sits on top of it) there are a couple of buttons used for comparing commits: clicking them allows you to pick which commits to use for the comparison on the current file.
Enable Code Review button
Comparison buttons on Debug Area

Related

Can I make Visual Studio automatically show corresponding header or implementation file in vertical split?

I'm new to Visual Studio, but have used several other IDE's over the years. I'm stunned by the poor out-of-the-box management of files, filters and "presentation" of coding, and now trying to find if there's a way to customize it the way I've found to be optimal for me.
First off, when programming C++, I'd like for the IDE to use a vertically split automatic view. Dragging and dropping a view to the right side giving me a "static" split is no problem, but that file will stay there untouched until I open another file while in this active view.
What I want is to make it so that when I click a .cpp-file in the explorer, it will show up in the left view - and its corresponding header-file will show in the right view. Likewise, when clicking a header-file, I'd want it to be presented in the right view and the corresponding .cpp-file to show in the left view. If either doesn't exist, just show a blank screen on its side.
When ctrl-clicking a class name, I'd want both the cpp and header-file to be presented, cpp on left and header on right.
Is this not possible?
The second thing that grinds my gears is the solution explorer. I simply don't understand the value of the filter system. I surely do not want every single .cpp file lined up alphabetically under each other, and every single header-file alphabetically another place. I want the explorer to replicate the folder structure as-is. And let me create a file in "src/my_folder/" by right-clicking "my_folder" and add->new item.
I've found that I can click "Switch views" and select "Folder view", but doing this seems to also invalidate the "Solution" and any configurations etc. The solution is literally gone, and the Build/Run-command switches to "Current document" and is completely detached from the project itself.
The closest option I've found is to be in "Solution view" and select "Show all files". The problem is that this shows literally all files and folders, including "output-folders", "hidden" and completely irrelevant files and folders that I don't want here. And I'm naturally not able to "hide" these files, as this is an option to "show all files".
Xcode on Mac has both of these features (and more snacks) pretty flawlessly implemented, and is my all-time favorite IDE per now.
Is there any way to replicate these features in Visual Studio?

How to Git Blame/Authors a previous revision with Xcode 11?

With Xcode 10.2, I could select the "Authors" view, then select a previous git revision to blame from the bottom picker:
But with Xcode 11 beta, when I select the "Authors" view, I'm unable to select a past revision to blame because the picker is missing:
Was that feature removed, or are there new steps to do to blame the lines of code for a past revision? To illustrate it even more, I'd like to see in Xcode 11 a past Blame like GitHub does when you blame a specific previous revision.
It has been moved here
It has been moved here
for a git blame version click Editor->Author as it, sure it moved
you can select the icon located in top-right of Xcode to find a previous revision
Select the icon in the window title bar to enter "Code Review" mode.
git log (History) is available at Cmd-Alt-2. There you can open a specific commit in code review mode via the context menu.
Mine wasn't showing up until I went to Editor > Show Last Change For Line. After I selected that, the 'Authors' row appeared in Editor > Authors, as well as in the 'Adjust Editor Options' icon in the top right of the page.
Answer to the original question:
You can't. Since Xcode 11, you can only git-blame your working copy. Note: This is my suggested answer after a lot of trying and googling. I'd be happy to learn the opposite.
Further information:
Many people, including me, seem to land on this page because they don't find the git-blame feature AT ALL in Xcode 11.
In Xcode < 10, the version editor came in three flavors: 1) Comparison view (=side-by-side diff), 2) Author (=git-blame) 3) Log. In all three flavors, you could choose a specific revision to look at.
In Xcode >= 11, the version editor (now called “Code Review”) only encompasses the comparison view (=side-by-side diff). The Code Review mode is toggled on/off with the double arrow button in the tool bar.
The Authors view (a.k.a. git-blame) is now a side-pane of the normal editor and can be toggled on/off in the Editor main menu. THIS OPTION IS NOT AVAILABLE WHEN YOU ARE IN CODE REVIEW MODE! For me, this caused confusion when looking for the Authors view.
The fact that the Authors view is not part of the version editor might be the reason that we cannot choose to look at arbitrary revisions. I have filed a suggestion with Apple to re-enable this feature. You should consider to do the same to give the issue more visibility.
In Xcode 11, the previous "Authors" menu item doesn't appear by default in the menu set. The simplest way to make it appear is to press the default key bind shift+control+command+A. After that, you'll find that "Minimap", "Authors", and "Code Coverage" now appear in the "Editors" menu.
If you go up to the top of Xcode, go to "View" and tap on "Show code review", you'll be able to get the git history with author information like on older versions of Xcode.

Is there a better way to see which Git branch I am on in the XCode 7 Interface?

I'd like to be able to see which Git branch I am currently working on at a glance in the XCode 7 (beta 5) interface without going through the menu system. Is this possible? I want to see the equivalent of running git branch from the command line which adds a star next to the current branch.
There are other questions which ask the question for earlier versions of XCode and I'd like to know if anything has changed or if anyone has any cleaver workarounds / solutions.
The only place I can see it is in the Source Control Menu after the project name:
Its also in the File Inspector in the Source Control Section which I can quickly show/hide using keyboard shortcuts but it would be nicer if I could see it as it is displayed in the Version Editor but without having to switch to the version editor:
Hi Codecowboy yes in Xcode 12.3 if you click on the so-called source code navigator (blue) x in the left menu panel header icon bar you should see the name of the project and the associated branch :-)

Xcode 4 - simultaneous viewing of Project Navigator and Debug Navigator and other Navigators

In Xcode 4 (4.2), is there a way to keep the Project Navigator view open and Debug Navigator view open as well. Must a user have one or the other, but not both? And the other navigators?
Apple seems to have decided that if you want to see the debug view, you don't want to see the files in your project. WTH? Am I getting this wrong? Did Apple Xcode UI guys even talk to developers before designing the UI for Xcode 4?
Sigh...
You can indeed have more navigators open at once, if you are prepared to have multiple windows open. I know it's not exactly what you're asking for, but for multiple display setups it's very handy. Xcode provides "behaviors" to help automate this process if you only want certain things showing at certain times.
For example, a common pattern that developers follow is to setup a behavior for "Run starts" that opens up a new window setup for debugging. Start by creating a new tab in your main Xcode window by pressing command-T, and double-click on the tab's title to rename is "Debug", or whatever you like. Then drag that window out (or leave it as a tab if you like), and customise the view as required - for example, for a deb window you might have the Debug area showing at the bottom (or even covering the whole editor view), and remove the toolbar at the top by right clicking and selecting "Hide Toolbar".
Next, go to "Xcode > Behaviors > Edit Behaviors..." and choose "Run starts" in the left panel. Check the box for "Show tab" and enter the name of your newly created tab. You can also ask that tab to automatically show the Debug Navigator, and show the debugger with variables and/or console view. If you like, you can then choose "Run completes" and show the original "tab" (window), which I've setup to be called "Coding", and show the required navigator (in my case, Project Navigator).
On successfully running, Xcode will now open up your new window (or bring it to the front if it's already open) with all the settings you left it with. On stopping, your main editor will be brought back to the front.
There are loads of useful behaviors, so I would really recommend looking through them and taking the time to setup Xcode to suit your style as best as possible. All software dictates to the user how to go about doing things, and the developers can never please everybody when they decide to change the UI. The best anybody can hope to achieve is to customise the interface as best as they can to fit their style of working. If it's still an issue for you, you can either adapt to it, or, if possible, move to something else.
I'm not a fan of every new interface feature in Xcode, but I've "made it mine" with some customisations and I can still be very productive. That being said there are a lot of things that I do really like about it, and for that I can forgive it for some of the less friendly features - after all, you can't please every user.

How can I make the tabs work normally on Xcode 4?

Xcode finally added tabs but the problem is that they behave very strange. For example they will keep a tab open only if it was opened to a new tab.
If you open a file just by clicking in the project tree, Xcode will close your tab as soon as you are clicking on another file in the tree.
Is is possible to make them behave like real tabs and prevent Xcode from reusing them? How?
I use a method similar to franks:
In Preferences > Navigation (or Preferences > General in versions of Xcode prior to 5) you can set Optional Navigation to Uses Separate Tab
Now opt-clicking a file in the file navigator will open it in a new tab
Better yet, opt-clicking links in the code opens the destination file in a new tab
The big feature missing is swapping to an already open tab containing the file if there is one (or staying in the current one).
UPDATE for 2020:
Finally, almost 10 years later, Xcode 12.x now appears to mostly resolve the issue described here. There is a new Navigation Style option in the Navigation settings panel that controls this behavior.
The behavior has some new quirks/design-choices that seem to make sense, but I'm still getting used to the new experience. For example, a tab will get re-used unless the file in that tab has been edited recently; such a tab is indicated with an italics title.
PREVIOUS ANSWER
I don't think you can currently get the behavior you desire (or I desire). While the tabs work like Safari, they don't work like tabs in other popular IDEs (Visual Studio or Eclipse). And for me this kind of sucks.
In general, I expect IDE tabs to keep more than 1 file open. So if I click a file in the project tree, I expect that it will switch to the tab I have opened with that file - if I have already opened it. Instead, XCode 4 changes the current tab to the file I clicked - making 2 tabs with the same file. Having 2 tabs with the same file is fairly useless.
This forces the user to scan the tab bar first to see if the file is currently opened; if it's not opened then you can look to the project tree. But if you click in the project tree first (which is what I tend to do) then you get punished because you will have just killed a tab.
This isn't really an answer insofar as it contains a solution; I mostly just want to join in the griping. But upvoting will make you feel better and prove Apple wrong. :)
The problem with Xcode 4's implementation of tabs is that Apple has implemented them as workspace tabs. In other words, creating a new tab essentially creates a new workspace, each with its own sub-panes with their configurations, etc. It's essentially a whole environment in each tab. There are a number of problems with this choice.
This differs from most IDE/text editors' implementation of file tabs wherein a tab (generally) represents a single file, and each file has its own tab.
The problem with workspace tabs is there are only so many potential different workspaces we could benefit from, severely limiting the actual use of tabs in this way. Beyond this, the additional workspaces just become a liability, introducing more things the user of the application needs to concern him/herself with: for example, what the navigator view is, what editor mode is active (standard, assistant, version), whether the debug console is open, etc. etc. Suddenly switching to a new tab means you now have to worry about getting the environment back in the form you need it, because there's a good chance the other tab wasn't left in the state you expect to find it in. This actually discourages the use of tabs because it introduces more work in the workflow.
File tabs don't have this problem (not counting special cases like split view panes) because all that's changing is the file you're looking at, not your whole environment. Moreover, if implemented properly, file tabs work great as an immediate history, allowing one to quickly switch back to a file that was worked in recently, with little effort. The only way to do this in Xcode is to explicitly set up a new tab environment for each file you want to work with, but you have to be careful not to change the file in that tab or your file all of a sudden becomes lost: again, more work for the user.
Workspace tabs are also significantly heavier-weight than file tabs, because there is much more to remember and switching workspaces involves much more than switching files.
The truth is (and I think most will agree with me on this), to a developer, file tabs are much more useful than workspace tabs, and as it stands Xcode still lacks a proper implementation of this feature that many would consider basic required functionality in an IDE/editor.
Xcode->Preferences->General->Double Click Navigation and from the list, choose Uses Separate Tab.
Well, not a real answer but my personal workaround. The real problem for me is, that a file opened in a tab goes away so easily in xcode 4. Finding a file again can be time-consuming, so I like them to be in a tab and stay there.
I solved this (somehow) for me by exactly identifying the actions I do which cause the tab to switch to another file and replace them by their equivalent actions which open a new tab instead.
Instead of single-clicking a file in the navigator, I always double-click which I have set to open a new tab
Most time I do not use the navigator, as it has a different state of opened and closed folders in each tab. Not useful for me. So I switched to using Option ⌥ Command ⌘ O. When opening a file from this list I keep ShiftOption ⌥ pressed. In the small window appearing I choose 'new tab'.
When clicking on links in code I press ShiftOption ⌥ Command ⌘, too, and open in new tab.
I keep two fixed tabs around for editing target-related settings and to view build results. I completely disabled all automatic tab switching in the prefs, because I noticed this distracted me to much.
I would really love to get something like the xcode 3 favorites bar in xcode 4, this was so simple to use..
I imagine my answer won't bubble up for a while, but if you want this to work like visual studio or intellij (or at least closer)
Preferences->General->Double Click Navigation->Uses a separate tab
Double Clicking a file now will stop opening it in a new window and open it in a new tab.
Single is still dumb and takes over your tab. But if you get used to double clicking (which I was already) this will save you some headaches. I suppose.
I absolutely hate how tabs work in Xcode. However, the only workaround i found that works decent is using the OSX tabs shortcuts:
CTRL + CMD + ->
CTRL + CMD + <-
I found my way in Preferences-Behaviors!
I hated Xcode 4 first for the tab issues discussed here, mainly because the debug information kept opening new files in tabs and changing the navigator
in Behaviors you can define a Debug tab and make the Run and Build jump there in various ways. in the Debug tab I give more space to navigators left and bottom
for similar reasons I have a Find tab, too
the other tabs are for files I am writing in. I start them with the .h which is usually small enough so I need only one view, and then with single clicks in the navegator I open 2-3 versions of the .cpp file so I can set them to the locations where the recent hot spots in the file are. then I close the navigators in those tabs
this does not invalidate the care and tricks given in the other answers here, but makes them far less hard
happy coding!
I found out that when pressing option a.k.a. alt when opening files in the navigator, you will jump to the tab already open with the file and a new tab will open in case it was not yet open.
This technique also works when opening files via cmdshift-O and opening the suggestion with option-enter in stead of simply enter...
Now, if there would be some way to make this the default, i.e. the need to keep pressing option all the time would be removed, that would be a big step forward.
Also I use Behaviors to keep my tabs from being recycled after test or build failures.
(Like other people, I totally mislike Xcode's tab behavior. Apple should take a look at IntelliJ...)
xcode tab bar is so suck, I think Apple should enhance the feature of the tab navigation to avoid followed 3 points.
1. double click a file will let xcode open another tab if it has already been there.
2. for more tabs, the tab will become small and thus I don't know which file in which tab, I want the tab show full name
3. for even more tabs, new tabs will be hidden, instead of two lines of tabs. I want to it show two lines of tab bars.
If you have the tab bar enabled (View/Show Tab Bar) and you double click a file, it appears in it's own window, with a single tab (Be sure the Tab Bar is enabled in both the new and old (main) windows).
Now all you have to do is drag that new window from its tab and drop it into the tab bar of your main window.
It will stay docked as a separate tab, showing that file.
To change the file open in that new tab, go Project / Reveal in Project Navigator, which opens the project navigator at the left hand side.
Tabs in Xcode 4 work like tabs elsewhere on Mac OS X, for example in Safari and Terminal.

Resources